ruby-on-rails - 如何向 has_many 关联添加更有意义的错误消息?

标签 ruby-on-rails error-handling

我的用户模型有很多这样的地址:

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列表示 workhome地址。

当我试图用错误保存两个地址时,我得到了一些对我来说似乎很奇怪的东西:
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/

相关文章:

javascript - discord.js 未处理的PromiseRejectionWarning : TypeError: Cannot read property 'kickable' of undefined

ruby-on-rails - Rails 未定义方法 `name' for nil :NilClass on FileUpload Too much unknown

ruby-on-rails - 如何将 session cookie 的 HttpOnly 设置为 false?

c++ - 这种错误检查方法在性能上会不会太昂贵了?

python - 有没有更优雅的方式在 Python 中引发错误?[具体案例]

mysql - SQL 错误 1292 尝试更新行字段

error-handling - 如何使用自定义结构实现错误

ruby-on-rails - Ruby on Rails : URL from ids to names/titles etc

ruby-on-rails - 来自 Sidekiq worker : How to pass a partial? 的邪恶 PDF 生成

ruby-on-rails - 如何捕获 ActiveRecord 表的审计历史