我有一个带有'email'字段的用户模型。
在我看来,我已将此字段的标签呈现为“电子邮件地址”,如下所示:
<%= form_for(:user) do |f| %>
<%= f.label :email, 'Email address' %><br /
<%= f.text_field :email %>
<% end %>
但是,当生成验证错误时,将使用“电子邮件”:
电子邮件无效
我是否可以添加到模型中以便:电子邮件总是呈现为“电子邮件地址”而不是简单地“电子邮件”?
非常感谢
答案 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..."
在您的视图中应该呈现:“电子邮件地址不能为空......”。