【问题标题】:Modifying a rails model at runtime在运行时修改 Rails 模型
【发布时间】:2011-04-17 22:11:38
【问题描述】:

在上一个问题上,我正在寻找一种方法 动态验证我的模型。

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 类的验证代码位于 Calendar 字段“config”中。

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

除了将配置值放在事件本身之外,我找不到其他方法。

有什么建议吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails-3 validation metaprogramming


    【解决方案1】:

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

    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
    

    【讨论】:

    • 似乎不起作用。尝试过,它会将我重定向到创建视图。我错过了什么吗?
    • 取决于您的控制器的接线方式,这可能是由于验证失败。我会检查正在“即时”运行的验证代码,并确保它仅在确实存在错误时才添加到错误集合中。还要确保没有代码设置“有效”属性,因为 Rails 会根据“错误”集合的值自动设置。
    • 我的测试是用一个简单的“validates_presence_of”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    相关资源
    最近更新 更多