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 ?
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
Vor dem Senden habe ich 'instance_eval',' class_eval' versucht und sie geben den gleichen Fehler zurück. – user938363
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