ActiveRecord验证...自定义字段名称

时间:2010-03-26 06:02:56

标签: ruby-on-rails activerecord

我想修复一些我的网站生成的错误消息。这是问题所在:

class Brand < ActiveRecord::Base
    validates_presence_of :foo
    ...
end

我的目标是发出消息“需要故障单描述”而不是“需要Foo”,或者可能不是空白或其他任何内容。

之所以如此重要,是因为我们之前说过该字段是ticket_summary。这很好,服务器编码使用它,但现在由于疯狂疯狂的业务分析师已经确定ticket_summary是一个糟糕的名称,应该是ticket_description。现在,我不一定希望我的数据库受用户对字段名称的要求的驱动,特别是因为它们可以在不更改功能的情况下频繁更改。

是否有提供此功能的机制?

澄清

:message =&gt;似乎不是正确的解决方案,:消息会给我“Foo [消息]”作为错误,我希望更改消息生成的字段名称,而不是实际的消息本身(虽然我会满足于必须更改整件事。)

3 个答案:

答案 0 :(得分:7)

将其添加到您的config/locales/en.yml文件中:

en:
  activerecord:
    errors:

      # global message format 
      format: #{message}

      full_messages:
        # shared message format across models
        foo:
          blank: Ticket description is required

        # model specific message format
        brand:
          zoo:
            blank: Name is required

现在更改验证消息以引用新的消息格式:

validates_presence_of :bar, :message => "Empty bar is not a good idea"
validates_presence_of :foo, :message => "foo.blank"
validates_presence_of :zoo, :message => "brand.zoo.blank"

让我们试试代码:

b = Brand.new
b.valid?
b.errors.full_messages
#=> ["Ticket description is required", 
#     "Empty bar is not a good idea",
#     "Name is required"]

如上所示,您可以在三个级别自定义错误消息格式。

1)全局用于所有ActiveRecord错误消息

  activerecord:
    errors:
      format: #{message}

2)跨模型的共享错误消息

  activerecord:
    errors:
      full_messages:
        foo:
          blank: Ticket description is required

3)特定于模型的消息

  activerecord:
    errors:
      full_messages:
        brand:
          zoo:
            blank: Name is required

答案 1 :(得分:7)

所以答案很简单......

定义

self.human_attribute_name(attribute)并返回人类可读的名称:

def self.human_attribute_name(attribute)
    if attribute == :foo 
        return 'bar'
    end
end

我当然会使用名字地图。那就是那个。

答案 2 :(得分:0)

您可以执行以下操作:

# config/locales/en.yml
en:
  activerecord:
    attributes:
      brand:
        foo: "Ticket description"
    errors:
      models:
        brand:
          attributes:
            foo:
              blank: " is required"

请查看Fully custom validation error message with Rails了解详情。