我使用上下文在模型生命周期的不同点调用特定的验证:
model Address
validates :city, presence: true
validates :street, presence: true, on: :send_letter
end
incomplete_address = Address.new(city: 'Berlin')
incomplete_address.valid? # => true
incomplete_address.valid?(:send_letter) # => false
这适用于上面的简单案例。但是,据我所知,任何相关对象都会忽略上下文:
model Address
belongs_to :country
validates :street, presence: true, on: :send_letter
validates_associated :country
end
model Country
has_many :addresses
validates :iso_alpha_3, presence: true, size: 3, on: :send_letter
end
incomplete_address = Address.new(street: 'Oranienstr', country: Country.new(name: 'Germany', iso_alpha_3: 'Invalid iso code')
incomplete_address.valid? # => true
incomplete_address.valid?(:send_letter) # => true
incomplete_address.country.valid?(:send_letter) => false
问题:这是预期的行为,还是我遇到的错误?还是我犯了一个概念上的错误?在这种情况下验证相关模型的最优雅方法是什么?
答案 0 :(得分:1)
是否存在预期行为,验证程序仅在当前模型中执行。 您可以使用自定义方法验证器获得所需的结果。
您可以找到更多信息here
答案 1 :(得分:1)
我知道这个问题已有3年历史了,但是现在有一条稍微容易的道路,并且即将出现一个更容易的选择。
当前有an outstanding PR通过validates_associated
调用上的配置选项添加了此功能。同时,您可以将该版本的AssociatedValidator
添加为单独的验证器(例如AssociatedPreservingContextValidator
),然后在“地址”中调用validate_with AssociatedPreservingContextValidator, :country
。