2016-04-01 24 views
0

Eval() wird verwendet, um einen workflow Block in Rails 4.2 Modell auszuwerten. Hier ist der workflow Block vor eval Verwendung:Nicht definierte Methode in eval()

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 

String variable spec ist definiert als:

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" 

und schreiben:

class PaymentRequest < ActiveRecord::Base 
    include Workflow 
    def self.load_wf(spec) 
     eval("Workflow::ClassMethods.workflow {#{spec}}")  
    end 
    ............... 
    end 

Der eval Fehler erzeugt:

undefined method 'workflow' for Workflow::ClassMethods:Module.

workflow ist ein Verfahren in einem Juwel:

module Workflow 
    module ClassMethods 
    attr_reader :workflow_spec 
    ..... 
    def workflow(&specification) 
     assign_workflow Specification.new(Hash.new, &specification) 
    end 
    ...... 
    end 
end 

Versuchte hinzufügen Bindung in eval und es hat nicht funktioniert (nicht sicher, ob die Bindung richtig eingesetzt). Wie zu machen eval Methode finden workflow & führen Sie es in das Modell ?

Antwort

2

Ich denke, das Problem hier ist, Sie versuchen, eine Methode aufzurufen, bevor es richtig gemischt wurde. Die Art, wie das Modul verwendet werden soll, ist documented on the home page. Da Sie dies dynamisch tun, müssen Sie versuchen, es so genau wie möglich zu finden.

Das heißt, etwas tun, wie folgt aus:

class PaymentRequest < ActiveRecord::Base 
    include Workflow 

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

Die workflow Methode sollte im Kontext definiert werden Sie hier in bist Ausführung, dass die Klasse PaymentRequest zu sein, und mit instance_eval es mit dem Aufbau könnte korrekte Bindungen. eval könnte funktionieren, also versuchen Sie es auch.

+0

Der Schritt, den ich diesem Problem nähere, ist step1 # run 'load_wf' mit einfachem Code und ohne' eval'. Nachdem Schritt1 funktioniert, ersetzen Sie Schritt2 # den Code durch 'eval'. Das Problem tritt bei Schritt 2 nach dem Eingeben von "eval" auf. In Schritt 1 wird "workflow" erfolgreich aufgerufen, und ich habe kein Problem beim Mixen gesehen. Ich denke, es ist wahrscheinlicher, dass es sich um einen Gültigkeitsbereich ("binding") mit "eval" handelt, wie Sie in einem anderen Beitrag angegeben haben. Aber es gibt nicht viel online über "binding" außer einer Definition. – user938363

+0

Vor dem Senden habe ich 'instance_eval',' class_eval' versucht und sie geben den gleichen Fehler zurück. – user938363

+0

Sie könnten einige Tests durchführen, wie zum Beispiel 'instance_eval (" raise self.methods.inspect ")', um zu sehen, ob es überhaupt vorhanden ist. Es sollte sein! – tadman

Verwandte Themen