Rails:字段名称

时间:2010-11-02 12:22:46

标签: ruby-on-rails ruby-on-rails-3

我有一个带有'email'字段的用户模型。

在我看来,我已将此字段的标签呈现为“电子邮件地址”,如下所示:

<%= form_for(:user) do |f| %>
  <%= f.label :email, 'Email address' %><br /
  <%= f.text_field :email %>
<% end %>

但是,当生成验证错误时,将使用“电子邮件”:

  

电子邮件无效

我是否可以添加到模型中以便:电子邮件总是呈现为“电子邮件地址”而不是简单地“电子邮件”?

非常感谢

4 个答案:

答案 0 :(得分:7)

您无需重命名表列即可执行此操作。有一个非常干净的解决方案:

class User < ActiveRecord::Base
  HUMAN_ATTRIBUTE_NAMES = {
    :email => 'Email address',
    :first_name => 'First name'
  }

  class << self
    def human_attribute_name attribute_name
      HUMAN_ATTRIBUTE_NAMES[attribute_name.to_sym] || super
    end
  end
end

我们所做的是创建一个我们想要自定义名称的属性哈希。您不必列出所有这些属性,因为许多属性名称将根据您的需要开箱即用。然后我们覆盖ActiveRecord的human_attribute_name方法,尝试首先在哈希中找到名称。

这有两件非常酷的事情:您不再需要在表单中指定自定义标签,并且您的错误消息也将自动具有新名称!作为奖励,您现在可以通过调用:

在任何地方使用这些名称
<%= User.human_attribute_name(:email) %>

这为命名创建了更统一的方法。如果您想在下周将“电子邮件”更改为“电子邮件”,则只需在一个地方进行。

我希望这有帮助!

答案 1 :(得分:4)

扩展gjb评论,我刚将其添加到config / initializers / inflections.rb:

ActiveSupport::Inflector.inflections do |inflect|
    inflect.human 'email', 'Email address' 
end

我认为这更加整洁。

答案 2 :(得分:1)

validates_presence_of  :email, :message => "address cannot be blank"

答案 3 :(得分:1)

有两种方法可以解决这个问题。将列重命名为email_address或修改用户模型中的验证(推荐):

validates_presence_of :email, :message => "Address cannot be blank..."

在您的视图中应该呈现:“电子邮件地址不能为空......”。