【发布时间】:2016-08-18 13:14:04
【问题描述】:
我的应用程序中有相当多的 belongs_to 关联,其中一些是可选的(即关联可以为 nil),有些是强制性的(关联必须是有效的父记录。
我最初的方法是使用我自己的验证方法来验证给定的 id(这里是强制关联)
belongs_to :category
validates :category_id,
presence: true
validate given_category_exists
def given_category_exists
if category_id.present?
errors.add( :category_id, 'must be present' ) \
Category.exists?( category_id )
end
end
然后我发现如果我对关联使用存在性检查,Rails 会为我执行此操作,因此我可以省略我自己的验证方法:
belongs_to :category
validates :category,
presence: true
但现在,生成的错误消息将简单地说明:Category can't be blank。这里的问题是:(1)我可以提供更有用的信息吗? (2) 如何插入我自己的属性翻译? Category 是 validates 方法生成的默认标签,can't be blank 是 :blank 的默认错误文本。
另一个问题:表单中的相关输入字段未标记为“field_with_errors”,因为该字段是用属性名称而不是关联名称标识的。
使用标准的处理方式,我将在我的 I18n 翻译文件中添加一个附加属性,用于关联名称 category,并添加一个替换标准消息:
en:
activerecord:
models:
attributes:
my_model:
category_id: 'This Category'
category: 'This Category'
errors:
models:
my_model:
attributes:
category:
blank: 'must be specified.'
很多行可能会出错。而且我不喜欢添加实际上不是属性而是关联名称的肤浅属性的想法。
有没有更简单的方法?
【问题讨论】:
-
不,您可能使用最简单的方法来防止以后的麻烦。