# model.rb
validates :employee_id, presence: true, uniqueness: true
如果留空,当我希望它说“员工ID不能为空”时,错误消息显示“员工不能为空”。
我通过以下方式解决了这个问题:
# model.rb
validates :employee_id, presence: { message: " ID can't be blank" }, uniqueness: true
输出“员工ID可以为空白”。
然而,这并不是IMO真正的好解决方案。我想要一些自定义整个消息的方法,包括属性前缀。
有一种简单的方法吗?
答案 0 :(得分:3)
有几种“正确”的方法,但你绝对不应该通过验证本身,或通过定义自己的验证方法。
在逐个模型级别上,这由类级human_attribute_name
方法控制。
如果您希望模型的employee_id
字段是不截断_id
后缀的特殊情况,请通过覆盖human_attribute_name
来定义该特殊情况:
class MyModel
validates :employee_id, presence: true
def self.human_attribute_name(attr, options = {})
attr == :employee_id ? 'Employee ID' : super
end
end
从更广泛的角度来说,您可以在human_attribute_name
上重新定义ActiveRecord::Base
以覆盖所有 _id
属性的处理,但我怀疑您是否想这样做。通常,Rails删除_id
后缀是一件好事。
第二种(可能更好)机制是简单地依赖本地化。 ActiveRecord与just about everything的语言环境YAML文件绑定。如果您希望employee_id
字段人性化为Employee ID
而不考虑语言,则需要编辑YAML文件。
# config/locales/en.yml
en:
activerecord:
attributes:
employee_id: "Employee ID"
答案 1 :(得分:-1)
您可以编写自定义验证。通过这种方式,您可以在验证方法中定义错误消息。
Rails指南的相关部分位于:Performing Custom Validations
类似的东西:
Class Paystub
validate :employee_id_is_not_blank
def employee_id_is_not_blank
errors[:base] << "Employee must be a part of the record.") if id.blank?
end
end
p = Paystub.create
p.errors.full_messages #=> ["Employee must be a part of the record."]
使用错误[:base]指定的Rails指南中的第7.4节。错误信息被铲入:基地不要求将属性绑定到它们。
更新:这不是正确的答案。请参阅上面的@meagars答案。