4

这里有两个类,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"]
4

3 回答 3

10

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

has_many :brands, validate: true

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

has_many :brands, validate: false
validates_associated :brands

注意:
如果您需要任何其他选项,例如 validates_related :if, :unless 等,您可以选择第二个选项...否则选择第一个选项,这不会导致重复错误。

于 2013-07-31T06:44:57.840 回答
1

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

c.errors.full_messages.uniq
#=> ["Brands is invalid"]
于 2016-08-02T14:00:16.587 回答
0
Here: 

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

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

于 2013-07-31T06:35:58.297 回答