将验证上下文传递给关联模型

时间:2017-05-23 09:56:32

标签: ruby-on-rails validation associations

我使用上下文在模型生命周期的不同点调用特定的验证:

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

问题:这是预期的行为,还是我遇到的错误?还是我犯了一个概念上的错误?在这种情况下验证相关模型的最优雅方法是什么?

2 个答案:

答案 0 :(得分:1)

是否存在预期行为,验证程序仅在当前模型中执行。 您可以使用自定义方法验证器获得所需的结果。

您可以找到更多信息here

答案 1 :(得分:1)

我知道这个问题已有3年历史了,但是现在有一条稍微容易的道路,并且即将出现一个更容易的选择。

当前有an outstanding PR通过validates_associated调用上的配置选项添加了此功能。同时,您可以将该版本的AssociatedValidator添加为单独的验证器(例如AssociatedPreservingContextValidator),然后在“地址”中调用validate_with AssociatedPreservingContextValidator, :country