eval()

2016-04-01 21 views
0

Eval() tanımlanmamış yöntemi, Rails 4.2 model payment_request modelinde workflow bloğunu değerlendirmek için kullanılır. Burada eval kullanmadan önce workflow blok: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 

dize spec değişken aşağıdaki gibi tanımlanır:

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" 

ve yeniden:

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

eval oluşturur hatası:

Güvenilir

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

eval bağlanma eklemek ve işe yaramadı (emin değilim bağlayıcı doğru kullanıldığı takdirde):

workflow bir taş bir yöntemdir.workflow & yöntemini payment_request modelinde nasıl uygularsınız?

cevap

2

Buradaki problemin, düzgün bir şekilde karıştırılmadan önce bir yöntemi çağırmaya çalıştığınız olduğunu düşünüyorum. Modülün kullanılacak şekli documented on the home page. Bunu dinamik olarak yaptığınızdan, bunu mümkün olduğunca yakından eşleştirip denemeniz gerekir. olduğu

, böyle bir şey yapmak:

class PaymentRequest < ActiveRecord::Base 
    include Workflow 

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

workflow yöntem PaymentRequest sınıf olma ve instance_eval kullanarak kurmak olabilir, buraya infaz konum bağlamında tanımlanması gerektiğini doğru bağlamalar. eval işe yarayabilir, bu yüzden onu da deneyin.

+0

Bu soruna yaklaştığım adım, düz kodlu ve herhangi bir "eval" olmaksızın, step1 # run 'load_wf '. Adım 1 sonra, sonra step2 # kodu ile değiştirmek "eval". Problem 'eval'ı tanıttıktan sonra adım 2'de gerçekleşir. 1. adımda' workflow' başarıyla çağrılır ve mixin problemini görmedim. Başka bir gönderide belirttiğiniz gibi “eval” ile bir kapsam (bağlama) olasılığının daha yüksek olduğunu düşünüyorum. Fakat bazı tanımlamalar dışında 'ciltleme' hakkında çok fazla çevrimiçi yok. – user938363

+0

Yayınlamadan önce, example_eval', class_eval' denedim ve aynı hatayı döndürdüler. – user938363

+0

Hatta var olup olmadığını görmek için örnek_eval ("self.methods.inspect") gibi bazı testler yapabilirsiniz. Olmalı! – tadman

İlgili konular