【问题标题】:Rails: Field namesRails:字段名称
【发布时间】:2010-11-02 12:22:45
【问题描述】:

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

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

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

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

电子邮件无效

有什么我可以添加到模型中以便 :email 始终呈现到“电子邮件地址”而不是简单的“电子邮件”吗?

非常感谢

【问题讨论】:

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


    【解决方案1】:

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

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

    这创建了一种更统一的命名方法。如果你想下周把“email”改成“e-mail”,你只需要在一个地方做。

    我希望这会有所帮助!

    【讨论】:

    • 杰米,你绝对是个天才。非常感谢!
    • 事实证明,human_attribute_name 实际上已被弃用以支持变形。我现在选择了 ActiveSupport::Inflector.inflections { |inflect| inflect.human 'email', 'Email address' } 作为替代。
    • 我相信这不再是真的。它在几年前被弃用,但现在又重新流行起来,现在甚至包括 i18n 支持(至少在 rails 3 中)。很难击中一个移动的目标,但我相信 human_attribute_name 不再是砧板上 :)
    • 我知道我在某个地方有这个......这是解释反向弃用的链接,以及为什么:apidock.com/rails/ActiveRecord/Base/human_attribute_name/class
    • 我在 Rails 3.0.3 中看到以下错误:“ActionView::Template::Error(参数数量错误(2 对 1))”我将上面的定义更改为“def human_attribute_name( attribute_name, options = {})" 让事情正常进行。
    【解决方案2】:

    扩展 gjb cmets,我刚刚将它添加到 config/initializers/inflections.rb:

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

    我认为这更整洁。

    【讨论】:

    • 同意,这是一个更简洁的解决方案。
    【解决方案3】:
    validates_presence_of  :email, :message => "address cannot be blank"
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多