我有两个模型Store
和StoreDetail
如下:
class Store
has_one :store_detail, dependent: :destroy
end
和StoreDetail:
class StoreDetail
belongs_to :store, class_name: 'Store'
belongs_to :state, class_name: 'State'
belongs_to :city, class_name: 'City'
belongs_to :zip_code, class_name: 'Zip Code'
end
我覆盖了state的属性,如下所示:
attributes:
store/store_detail:
state: "State"
city: "City"
zip_code: "Zip Code"
但是我收到了验证消息:
Store detail state can't be blank
Store detail city can't be blank
Store detail zip code can't be blank
我想在没有“商店详细信息”的情况下制作它,如下所示:
State can't be blank
如何覆盖嵌套属性?
答案 0 :(得分:0)
您可以使用自定义验证消息:
class StoreDetail < ActiveRecord::Base
validates :state_id, presence: true,
message: I18n.t(:state_cant_be_blank)
end
然后在locales / *。yml
中 en:
state_cant_be_blank: State can't be blank
答案 1 :(得分:0)
i18n非常有可能:
en:
activerecord:
errors:
models:
store_detail:
attributes:
state:
blank: State can't be blank.
city:
blank: City can't be blank.
zip_code:
blank: Zip code cant't be blank.
非常重要
以&#34; en&#34;开头的所有嵌套标签以&#34;模特&#34;结束必须与示例中指定的完全一致。
对于en.yml中的模型名称(或您使用的任何kangage文件)至关重要
模型名称必须与model.rb匹配,因为这标识了要为activerecord验证的字段名称
验证字段名称必须与schema.rb字段名称匹配,例如zip_code,而不是zip。
&#34;空白:&#34;标识符告诉Rails activerecord组件在特定验证失败时执行字符串替换i18n yaml文件中的字符串。
调试i18n (已添加)
验证YAML :如果您没有看到您定义的en.yml验证消息,但默认值仍然显示,则您的en.yml由于某种原因无法运行。 YAML非常挑剔文件中的空格和文件中的任何尾随空格等。但它没有显示任何错误,它只是恢复使用Rails默认消息。这是一个YAML Lint工具:http://yaml-online-parser.appspot.com/
适用于i18n的Rails规范:http://guides.rubyonrails.org/i18n.html。
调试i18n :使用gem i18n-tasks创建i18n组件的综合报告:https://github.com/glebm/i18n-tasks
Application.rb :确保您已安装i18n。
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
config.i18n.default_locale = :en
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
如果您需要针对activerecord类型错误的自定义错误消息,则必须通过i18n进行操作。这不是一件很整洁的事情。它根本不是DRY,但它是可用的。