Rails 4验证消息:删除" _id"来自消息

时间:2014-06-06 23:42:52

标签: validation ruby-on-rails-4 rails-activerecord

# 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真正的好解决方案。我想要一些自定义整个消息的方法,包括属性前缀。

有一种简单的方法吗?

2 个答案:

答案 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答案。