2017-08-05 106 views
1

我已经配置application.rb中具有下列选项添加索引错误的嵌套模型:覆盖全局index_errors选项

config.active_record.index_nested_attribute_errors = true 

我有很多的模式和它的伟大工程,但我要改变这种行为的单一模式,就像这样:

# frozen_string_literal: true 
class User < ApplicationRecord 
    has_many :addresses, 
      inverse_of: :user, 
      dependent: :destroy, 
      index_errors: false #note here 
end 

但是它不按预期工作,换句话说,这些错误仍然会是这样的:

{"addresses_attributes[0].zip_code":[{"error":"blank"}]} 

由于我重写(或没有)的全局配置,我期望这样的:

{"addresses_attributes.zip_code":[{"error":"blank"}]} 

好像我不能从application.rb中覆盖全局配置。有什么想法吗?

回答

0

方式的代码在 https://github.com/rails/rails/blob/95ad242c8066e71c403d53ea634f347e357473b1/activerecord/lib/active_record/autosave_association.rb#L331

书面它会检查其中一方被设置为true索引错误。

换句话说,如果设置了全局配置,那么无法为一次性模型关闭它。

UPDATE: 您可以通过,而为你解答做​​一些像

errors = model.errors.messages 
new_errors = {} 

errors.each do |key, value| 
    next unless key.to_s.include? "addresses_attributes[" 

    errors.delete key 
    new_key = key.to_s.gsub /\[\d+\]/, "" 
    new_errors[new_key] = value 
end 

errors.merge! new_errors 
+0

感谢更新错误。没有办法在模型级重写这个配置吗?我尝试在我的模型中执行'Rails.configuration.active_record.index_nested_attribute_errors = false',它会编译,但不覆盖全局设置。 –

+0

从未尝试过,但Rails会非常脆弱,允许配置在应用程序启动后设置/重置。你为什么不重写这个错误的密钥,因为解决方法 –

+0

你可以这样做来改变错误: –