2011-04-17 99 views
1

对于上一个问题,我正在寻找一种方式来动态调整模型的 。在运行时修改导轨模型

Advice on "Dynamic" Model validation

,我得到了工作的解决方案是:

def after_initialize   
    singleton = class << self; self; end 

    validations = eval(calendar.cofig) 

    validations.each do |val| 
    singleton.class_eval(val) 
    end 
end 

在我实际的应用程序,我有2种型号

class Calendar < ActiveRecord::Base 
    has_many :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :calendar 

    def after_initialize   
    singleton = class << self; self; end 

    validations = eval(calendar.cofig) 

    validations.each do |val| 
     singleton.class_eval(val) 
    end 
end 

end 

正如你所看到的,验证代码应该被添加到Event类中的日历字段为“config”。

适用于现有活动,但不适用于新纪录。这是因为,在调用after_initialize时,关联不存在。

除了在事件本身上放置配置值之外,我无法找到一种方法来做到这一点。

任何建议?

韩国社交协会!

回答

0

您可能想要在验证阶段运行验证代码,而不是初始化阶段。试试这个:

class Calendar < ActiveRecord::Base 
    has_many :events 
end 

class Event < ActiveRecord::Base 
    belongs_to :calendar 

    validate do |event| 
    validations = eval(calendar.cofig) 
    validations.each do |val| 
     eval(val) 
    end 
    end 
end 
+0

似乎没有工作。试过了,它将我重定向到创建视图。我错过了什么吗? – 2011-04-18 13:19:37

+0

取决于您的控制器如何接线,这可能是由于验证失败。我会检查正在“即时”运行的验证代码,并确保只有在确实存在错误时才将其添加到错误集合中。还要确保没有代码设置“valid”属性,因为Rails根据“errors”集合的值自动设置它。 – MDaubs 2011-04-18 16:29:10

+0

我的测试是用一个简单的“validates_presence_of” – 2011-04-18 16:54:16