我找到了一种方法来完成这项工作,但我对好的方式/ Rails 3方式感到好奇。 (我仍然使用2.3.5,但希望在新年前后迁移。)如何在多代模块中定义/附加导轨验证
情况:我有两层模块继承,第二层被混合到Rails模型中。这两个模块定义的验证方法,我想他们都在验证连接到基础类,但由于继承的两个层次,下面不工作:
def self.included(base)
base.validate :yadda_yadda
end
当包括该模块由另一个模块,解释器研磨到尖锐的停顿,因为模块不知道约ActiveRecord::Validations
。包括验证模块会引起“save
?”的问题。感谢alias_method
。
以下的工作,只要你记得打电话super
,只要你覆盖validate()
。我不相信自己或未来的维护者要记住这一点,所以如果可能的话,我想使用validate :yadda_yadda
成语。
module Grandpa
def validate
must_be_ok
end
def must_be_ok
errors.add_to_base("#{self} wasn't ok")
end
end
module Dad
include Grandpa
def validate
super
must_be_ok_too
end
def must_be_ok_too
errors.add_to_base("#{self} wasn't ok either")
end
end
class Kid < ActiveRecord::Base
include Dad
validate :must_be_ok_three
def must_be_ok_three
errors.add_to_base("#{self} wasn't ok furthermore")
end
end
建议? Rails 3的方法?我认为验证API没有太大改变。
那么要清楚你想要跨多个模型共享验证? – jonnii 2010-12-02 20:43:23