Rails 4 验证消息:从消息中删除“_id”

Dan*_*n L 3 validation ruby-on-rails-4 rails-activerecord

# model.rb
validates :employee_id, presence: true, uniqueness: true
Run Code Online (Sandbox Code Playgroud)

留空时,错误消息显示“员工不能为空”,而我希望它说“员工 ID 不能为空”。

我通过以下方式解决了这个问题:

# model.rb
validates :employee_id, presence: { message: " ID can't be blank" }, uniqueness: true
Run Code Online (Sandbox Code Playgroud)

输出“员工 ID 不能为空”。

然而,这不是一个很好的解决方案 IMO。我想要一些自定义整个消息的方法,包括属性前缀。

有没有一种简单的方法可以做到这一点?

mea*_*gar 5

有几种“正确”的方法可以解决这个问题,但您绝对不应该通过验证本身或通过定义自己的验证方法来做到这一点。

在逐个模型级别上,这由类级别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
Run Code Online (Sandbox Code Playgroud)

在更广泛的方面,你可以重新定义human_attribute_nameActiveRecord::Base覆盖处理的所有 _id属性,但我怀疑你想这样做。一般来说,Rails 放弃_idpostfix是一件好事。

第二种(可能更好)的机制是简单地依赖本地化。ActiveRecord 与您的语言环境 YAML 文件相关联,几乎涵盖所有内容。如果您希望您的employee_id领域变得人性化,Employee ID而不管语言如何,您都需要编辑您的 YAML 文件。

class MyModel

  validates :employee_id, presence: true

  def self.human_attribute_name(attr, options = {})
    attr == :employee_id ? 'Employee ID' : super
  end
end
Run Code Online (Sandbox Code Playgroud)