Rails:字段名称

gjb*_*gjb 6 ruby-on-rails ruby-on-rails-3

我有一个带有'email'字段的User模型.

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

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

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

电子邮件无效

我可以添加到模型中以便:电子邮件始终呈现为"电子邮件地址"而不是简单地"电子邮件"吗?

非常感谢

Jai*_*yer 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
Run Code Online (Sandbox Code Playgroud)

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

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

<%= User.human_attribute_name(:email) %>
Run Code Online (Sandbox Code Playgroud)

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

我希望这有帮助!

  • 我看到在滑轨3.0.3以下错误:"::的ActionView模板::错误(错误的参数数目(2 1))"我改变上面的定义"DEF human_attribute_name(属性名称,选项= {})"把事情搞定. (2认同)

Mar*_*ici 5

扩展 gjb 注释,我只是将其添加到 config/initializers/inflections.rb 中:

ActiveSupport::Inflector.inflections do |inflect|
    inflect.human 'email', 'Email address' 
end
Run Code Online (Sandbox Code Playgroud)

我认为这要整洁得多。