ruby-on-rails - rails : Field names

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

我有一个带有“电子邮件”字段的用户模型。

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

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

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

Email is invalid

我可以在模型中添加一些内容,以便 :email 始终呈现为“电子邮件地址”而不是简单的“电子邮件”吗?

非常感谢

最佳答案

您不需要重命名表列即可执行此操作。有一个非常干净的修复:

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) %>

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

希望这会有所帮助!

关于ruby-on-rails - rails : Field names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4077561/

相关文章:

ruby-on-rails - ruby 中的继承和扩展

IOS上传图片到AWS 3 生成随机唯一键名

javascript - Ruby On Rails before_filter 调用了两次?

ruby-on-rails - 错误 : No route matches [GET] "/cgi-bin/webscr"

ruby-on-rails-3 - Carrierwave:如何裁剪和调整大小以使最终图片具有完全相同的宽度和高度?

ruby-on-rails - Rails 3 嵌套资源路由继承父约束,如何避免?

html - 想要在提交和页面重新加载后保留选定的 html 选项

mysql - 对打乱的 ActiveRecord 查询进行分页

ruby - 批量分配 protected 属性 : user, 格式、操作、 Controller

ruby-on-rails - 如何在 rake 上设置默认主机?