开发者

Forcing "humanized" names of fields to be lowercase in Rails 3

开发者 https://www.devze.com 2023-02-08 02:39 出处:网络
As far as I know, the accepted way to set the \"humanized\" names of field开发者_如何学编程s in Rails 3 is to use locales:

As far as I know, the accepted way to set the "humanized" names of field开发者_如何学编程s in Rails 3 is to use locales:

# config/locales/en.yml
en:
  activerecord:
    attributes:
      member:
        username: 'username' # rather than 'Username'

However, I simply want Rails 3 to use lowercase versions of its default humanized names. Is there an easy, built-in way to do this?

An example to help clarify: When inside of a form_for, <%= f.label :username %> displays "Username" by default. I want it to display "username".


I had the same problem. I solved it via css:

In foo.html.erb:

<%= f.label :username, :class => "my_class" %>

In bar.css:

label.my_class {
    text-transform:   lowercase;
}

I would prefer a different solution, too. But that's the only one I've been able to find, so far.


The label helper defaults to using human_attribute_name to turn an attribute into a human name. If you look at the source, human_attribute_name tries a few things before falling back to attributes.to_s.humanize. It tries the translation first, and then it looks for a :default option in the options hash.

So, the simplest/best way to get the functionality you want is to override human_attribute_name with your own that provides a :default option and then calls the original. Rails provides a reasonable way to do this sort of thing with alias_method_chain, so...

I've heard enough, just give me the answer!

Put the following in any file in config/initializers and restart your app:

module ActiveModel
  module Translation
    def human_attribute_name_with_foo attribute, options = {}
      human_attribute_name_without_foo attribute, options.merge( :default => attribute.humanize.downcase )
    end

    alias_method_chain :human_attribute_name, :foo
  end
end
0

精彩评论

暂无评论...
验证码 换一张
取 消