2016-04-01 20 views
0

Eval()は、Rails 4.2モデルpayment_requestworkflowブロックを評価するために使用されます。ここで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で実行しますか?

答えて

2

ここで問題は、正しく混合される前にメソッドを呼び出そうとしていることです。このモジュールの使用方法はdocumented on the home pageです。これを動的に実行しているので、できるだけ近くで試してみる必要があります。ある

は、このような何かを:

class PaymentRequest < ActiveRecord::Base 
    include Workflow 

    def self.load_wf(spec) 
    instance_eval("workflow {#{spec}}")  
    end 
end 

workflow方法がPaymentRequestクラスであること、およびinstance_evalを使用すると、それをセットアップするかもしれないことを、あなたはここで実行しているコンテキストで定義されなければなりません正しいバインディング。 evalが動作する可能性がありますので、試してみてください。

+0

私はこの問題に近づいていますが、step1#は 'eval'のないプレーンコードで' load_wf'を実行します。 step1が動作した後、step2#はコードを 'eval'に置き換えます。問題は 'eval'を導入した後にstep2で発生します。ステップ1では' workflow'が正常に呼び出され、mixinの問題は見られませんでした。私はあなたが別の投稿に示したように、evalというスコープ(束縛)の可能性が高いと感じています。しかし、いくつかの定義を除いて、 '束縛'についてのオンラインはあまりありません。 – user938363

+0

投稿する前に、私は 'instance_eval'、' class_eval'を試してみて、同じエラーを返します。 – user938363

+0

'instance_eval(" raise self.methods.inspect ")'のようなテストをして、そこにも存在するかどうかを調べることができます。そのはず! – tadman

関連する問題