From c2b6f63bbe2740fd63a36eeefe17d51813a17324 Mon Sep 17 00:00:00 2001
From: Alexander Uvarov <alexander.uvarov@gmail.com>
Date: Thu, 17 Nov 2011 12:04:46 +0600
Subject: Fix impractical I18n lookup in nested fields_for

---
 actionpack/lib/action_view/helpers/form_helper.rb | 10 ++++-
 actionpack/test/template/form_helper_test.rb      | 46 +++++++++++++++++++++++
 2 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb
index f148ffbd73..d687866d0d 100644
--- a/actionpack/lib/action_view/helpers/form_helper.rb
+++ b/actionpack/lib/action_view/helpers/form_helper.rb
@@ -995,8 +995,16 @@ module ActionView
           label_tag(name_and_id["id"], options, &block)
         else
           content = if text.blank?
+            object_name.gsub!(/\[(.*)_attributes\]\[\d\]/, '.\1')
             method_and_value = tag_value.present? ? "#{method_name}.#{tag_value}" : method_name
-            I18n.t("helpers.label.#{object_name}.#{method_and_value}", :default => "").presence
+
+            if object.respond_to?(:to_model)
+              key = object.class.model_name.i18n_key
+              i18n_default = ["#{key}.#{method_and_value}".to_sym, ""]
+            end
+
+            i18n_default ||= ""
+            I18n.t("#{object_name}.#{method_and_value}", :default => i18n_default, :scope => "helpers.label").presence
           else
             text.to_s
           end
diff --git a/actionpack/test/template/form_helper_test.rb b/actionpack/test/template/form_helper_test.rb
index 6434d9645e..34486bb151 100644
--- a/actionpack/test/template/form_helper_test.rb
+++ b/actionpack/test/template/form_helper_test.rb
@@ -27,7 +27,13 @@ class FormHelperTest < ActionView::TestCase
             :body => "Write entire text here",
             :color => {
               :red => "Rojo"
+            },
+            :comments => {
+              :body => "Write body here"
             }
+          },
+          :tag => {
+            :value => "Tag"
           }
         }
       }
@@ -68,6 +74,12 @@ class FormHelperTest < ActionView::TestCase
     @post.secret      = 1
     @post.written_on  = Date.new(2004, 6, 15)
 
+    @post.comments = []
+    @post.comments << @comment
+
+    @post.tags = []
+    @post.tags << Tag.new
+
     @blog_post = Blog::Post.new("And his name will be forty and four.", 44)
   end
 
@@ -151,6 +163,40 @@ class FormHelperTest < ActionView::TestCase
     I18n.locale = old_locale
   end
 
+  def test_label_with_locales_and_nested_attributes
+    old_locale, I18n.locale = I18n.locale, :label
+    form_for(@post, :html => { :id => 'create-post' }) do |f|
+      f.fields_for(:comments) do |cf|
+        concat cf.label(:body)
+      end
+    end
+
+    expected = whole_form("/posts/123", "create-post" , "edit_post", :method => "put") do
+      "<label for=\"post_comments_attributes_0_body\">Write body here</label>"
+    end
+
+    assert_dom_equal expected, output_buffer
+  ensure
+    I18n.locale = old_locale
+  end
+
+  def test_label_with_locales_fallback_and_nested_attributes
+    old_locale, I18n.locale = I18n.locale, :label
+    form_for(@post, :html => { :id => 'create-post' }) do |f|
+      f.fields_for(:tags) do |cf|
+        concat cf.label(:value)
+      end
+    end
+
+    expected = whole_form("/posts/123", "create-post" , "edit_post", :method => "put") do
+      "<label for=\"post_tags_attributes_0_value\">Tag</label>"
+    end
+
+    assert_dom_equal expected, output_buffer
+  ensure
+    I18n.locale = old_locale
+  end
+
   def test_label_with_for_attribute_as_symbol
     assert_dom_equal('<label for="my_for">Title</label>', label(:post, :title, nil, :for => "my_for"))
   end
-- 
cgit v1.2.3