使用validates_associated重复的错误消息

时间:2013-07-31 06:11:08

标签: ruby-on-rails

这是两个类,1:n关系

class Company < AR::Base
  has_many :brands
  validates_associated :brands
end

class Brand < AR::Base
  belongs_to :company
  validates_presence_of :name
end

我尝试为公司添加品牌。如果品牌名称为空,则会向我提供重复的错误消息。

c = Company.find(1)
c.valid?
# => true
c.brands.new
# => #<Brand id: nil, name: nil, company_id: 1, created_at: nil, updated_at: nil>
c.valid?
#=> false
c.errors.full_message
#=> ["Brands is invalid", "Brands is invalid"]
c.brands.last.errors.full_message
#=> ["Name required"]

3 个答案:

答案 0 :(得分:7)

相关的验证可以通过两种方式实现   第一个选项简单:

has_many :brands, validate: true

第二个选项正在使用validates_associated,这将导致重复的错误消息,并且可以通过显式将validate设置为false来避免:

has_many :brands, validate: false
validates_associated :brands

注意:
  如果您需要任何其他选项,例如validates_associated,您可以选择第二个选项:if,:除非等...否则请使用不会导致重复错误的第一个选项。

答案 1 :(得分:0)

Here: 

c.errors.full_message
#=> ["Brands is invalid", "Brands is invalid"]

每个都返回两个错误消息,因为一个用于品牌对象,另一个用于品牌字段验证错误消息。因此,c.brands.last.errors.full_message是验证的正确方法。

答案 2 :(得分:0)

快速解决方法,只需从数组中删除重复项:

c.errors.full_messages.uniq
#=> ["Brands is invalid"]