Forum: Rails I18n Labels, I18n and accepts_nested_attributes_for

Posted by Paul Schreiber (Guest)
on 2010-11-29 07:39
Attachment: smime.p7s (3,66 KB)
(Received via mailing list)
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 youd construct your en.yml like so:
en:
 helpers:
   label:
     name: your name

However, this doesnt 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 didnt work. So I looked inside rails to see whats 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 Ill file a lighthouse ticket.



Paul
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.