我的用户模型有很多这样的地址:
class User < ApplicationRecord
has_many :addresses, dependent: :destroy
accepts_nested_attributes_for :addresses, allow_destroy: true
end
class Address < ApplicationRecord
belongs_to :user
validates :address_line_1, :city, :state, :zip, presence: true
end
Address
模型还有一个 address_type
列表示 work
或 home
地址。当我试图用错误保存两个地址时,我得到了一些对我来说似乎很奇怪的东西:
a = User.last
a.addresses # This user has both a home and work address
=> #<ActiveRecord::Associations::CollectionProxy #<Address id: 1, address_line_1: "123 Bob St.", city: "Blah", zip: "12345", state: "KY", address_type: "home", user_id: "1">, #<Address id: 2, address_line_1: "123 Jane St.", city: "Bloh", zip: "12345", state: "KY", address_type: "work", user_id: "1">
a.assign_attributes(addresses_attributes: { "0" => { address_line_1: nil, id: 1 }, "1" => { address_line_1: nil, id: 2 } })
a.save # This is false
a.errors.details # Shows only 1 error
=> {:"addresses.address_line_1"=>[{:error=>:blank}]}
从上面可以看出,当两个地址都无效时,Rails 只提供 1 个错误。我无法通过查看来判断两者是无效还是只有一个,并且我无法判断哪个有错误。有没有办法提供更详细的错误消息,可能是这样的:
{:"work_address.address_line_1"=>[{:error=>:blank}], :"home_address.address_line_1"=>[{:error=>:blank}]}
或者至少包括对象 ID:
{:"addresses.address_line_1"=>[{:error=>:blank, :ids=>[1,2]}]}
最佳答案
您可以通过以下方式指定关联索引错误来访问嵌套验证错误:
has_many :addresses, dependent: :destroy, index_errors: true
给定索引,您就可以确定
addres_type
.index_errors: true
的完整示例可以在这里看到这篇文章:https://blog.bigbinary.com/2016/07/07/errors-can-be-indexed-with-nested-attrbutes-in-rails-5.html
关于ruby-on-rails - 如何向 has_many 关联添加更有意义的错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59326672/