Eval()は、Rails 4.2モデルpayment_request
のworkflow
ブロックを評価するために使用されます。ここでworkflow
ブロックはeval
を使用する前である:未定義のメソッドeval()
spec = "state :initial_state do
event :submit, :transitions_to => :ceo_reviewing
end
state :ceo_reviewing do
event :reject, :transitions_to => :rejected
event :approve, :transitions_to => :approved
end
state :rejected
state :approved"
書き換え:spec
可変
class PaymentRequest < ActiveRecord::Base
include Workflow
def self.load_wf
workflow do
state :initial_state do
event :submit, :transitions_to => :ceo_reviewing
end
state :ceo_reviewing do
event :reject, :transitions_to => :rejected
event :approve, :transitions_to => :approved
end
state :rejected
state :approved
end
end
..........
end
文字列は次のように定義され
class PaymentRequest < ActiveRecord::Base
include Workflow
def self.load_wf(spec)
eval("Workflow::ClassMethods.workflow {#{spec}}")
end
...............
end
eval
でエラーが発生:
undefined method 'workflow' for Workflow::ClassMethods:Module.
workflow
は、宝石のメソッドです:
module Workflow
module ClassMethods
attr_reader :workflow_spec
.....
def workflow(&specification)
assign_workflow Specification.new(Hash.new, &specification)
end
......
end
end
はevalの中でバインディングを追加しようとしましたが、それは(バインドが正しく使用されているかどうかわからない)動作しませんでした。 eval
検索方法workflow
& payment_request
で実行しますか?
私はこの問題に近づいていますが、step1#は 'eval'のないプレーンコードで' load_wf'を実行します。 step1が動作した後、step2#はコードを 'eval'に置き換えます。問題は 'eval'を導入した後にstep2で発生します。ステップ1では' workflow'が正常に呼び出され、mixinの問題は見られませんでした。私はあなたが別の投稿に示したように、evalというスコープ(束縛)の可能性が高いと感じています。しかし、いくつかの定義を除いて、 '束縛'についてのオンラインはあまりありません。 – user938363
投稿する前に、私は 'instance_eval'、' class_eval'を試してみて、同じエラーを返します。 – user938363
'instance_eval(" raise self.methods.inspect ")'のようなテストをして、そこにも存在するかどうかを調べることができます。そのはず! – tadman