2010-03-26 131 views
2

我想修复我的网站生成的一些错误消息。这里的问题是:ActiveRecord验证...自定义字段名称

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

我的目标是做一个信息“票务描述需要”,而不是“foo是必需的”或不能为空,或者别的什么东西。

这是如此重要的原因是因为让我们先前说这个领域是ticket_summary。这真是太棒了,服务器被编码使用它,但现在由于疯狂的疯狂业务分析人员已经确定ticket_summary是一个可怜的名字,应该是ticket_description。现在我不一定希望我的数据库受用户对字段名称的需求驱动,尤其是因为它们可以在不更改功能的情况下频繁更改。

有没有提供这种机制?

要澄清

:消息=>似乎并没有被正确的解决方案,:消息会给我“富[消息]”的错误,我期待改变生成的字段名消息,而不是实际的信息本身(尽管我会解决不得不改变整个事情)。

回答

7

因此,答案是很简单...

定义

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

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

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

+0

这是一个很好的解决方案。我的解决方案是非常通用的,它允许您更改语言环境文件中的消息及其格式,而不是Ruby代码。 –

+1

如果该属性不是:foo,您是否需要在最后调用super? – cmrichards

+0

大,但这种方法在轨道4,5两个参数,做这样: 高清self.human_attribute_name(attribute_key_name,选择= {}) 情况attribute_key_name 时:FOO 回报 “酒吧” 其他 回报超(attribute_key_name,选项) 结束 结束 –

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 
+0

这不是问题。该消息将是“+ Foo +这是我的自定义错误消息”。我需要“+ Bar +这是我的自定义错误消息”为foo字段。 –

+0

我已经更新了我的答案,这应该满足您的需求。看一看。 –

+0

请参阅我的答案,以获得更简单的解决方案:P –

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了解更多详情。