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.



Paul

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to