Labels, I18n and accepts_nested_attributes_for

Note: I am using Rails 2.3.10.

Normally, you can use Rails’ I18n system to generate label text.

For example, suppose you have a Person class with a name attribute. And this ERB: <%= form_for @person do |f| %> <%= f.label :name %> <%= f.text_field :name %> <% end %>

And you’d construct your en.yml like so: en:   helpers:     label:       name: “your name”

However, this doesn’t work very well with related objects and accepts_nested_attributes_for. Suppose you have the same Person class as before. And person has_many :activities (likewise, activity belongs_to :person) and accepts_nested_attributes_for :activities.

Now your ERB looks like this: <%= form_for @person do |f| %> <%= f.label :name %> <%= f.text_field :name %>   <% f.fields_for :activities do |a| %>     <%= l.label :difficulty %>     <%= l.text_field :difficulty %>   <% end %> <% end %>

Various combinations indentation of person / activities / difficulty in my en.yml file didn’t work. So I looked inside rails to see what’s going on.

The relevant code is in actionpack-2.3.10/lib/action_view/helpers/form_helper.rb. The method used is
  def to_label_tag(text = nil, options = {}) on line 758.

And the code doing the work is:         content = if text.blank?           i18n_label = I18n.t("helpers.label.#{object_name}.#{method_name}", :default => “”)           i18n_label if i18n_label.present?         else           text.to_s         end

The problem is you end up with a set of labels like:   helpers.label.person[activities_attributes][0].difficulty   helpers.label.person[activities_attributes][1].difficulty   helpers.label.person[activities_attributes][2].difficulty

Is there a way you can put wildcards in YAML? If not, is there some other way around this limitation? If not, this seems like a bug in Rails, and I’ll file a lighthouse ticket.


I am having the same problem with Rails 3.0.3. If you don't require context-dependent labels, you can use en.activerecord.attributes.activity.some_field_here (notice it is not nested inside the person model). However, I have not found any workaround if your label IS context dependent, and I believe it should probably be filed on lighthouse.


Filed as: <Tickets - Ruby on Rails - rails 6273-cannot-create-i18n-labels-when-using- accepts_nested_attributes_for>