diff options
author | Michael Koziarski <michael@koziarski.com> | 2008-01-16 02:01:57 +0000 |
---|---|---|
committer | Michael Koziarski <michael@koziarski.com> | 2008-01-16 02:01:57 +0000 |
commit | b812b236876ab7a6bd1f3e58a1aa71847394f3a1 (patch) | |
tree | 28e65251aee0a1007bec37b03c4ae2b5c41ff293 | |
parent | 8a71f870093ccdfa0b04e318cca0f517576be380 (diff) | |
download | rails-b812b236876ab7a6bd1f3e58a1aa71847394f3a1.tar.gz rails-b812b236876ab7a6bd1f3e58a1aa71847394f3a1.tar.bz2 rails-b812b236876ab7a6bd1f3e58a1aa71847394f3a1.zip |
Make render :partial recognise form builders and use the _form partial. Closes #10814 [djanowski]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@8646 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/form_helper.rb | 15 | ||||
-rw-r--r-- | actionpack/lib/action_view/partials.rb | 3 | ||||
-rw-r--r-- | actionpack/test/controller/new_render_test.rb | 23 | ||||
-rw-r--r-- | actionpack/test/fixtures/test/_form.erb | 1 | ||||
-rw-r--r-- | actionpack/test/fixtures/test/_labelling_form.erb | 1 |
6 files changed, 45 insertions, 0 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index e89123e679..bc8caaa3ef 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Make render :partial recognise form builders and use the _form partial. #10814 [djanowski] + * Allow users to declare other namespaces when using the atom feed helpers. #10304 [david.calavera] * Introduce send_file :x_sendfile => true to send an X-Sendfile response header. [Jeremy Kemper] diff --git a/actionpack/lib/action_view/helpers/form_helper.rb b/actionpack/lib/action_view/helpers/form_helper.rb index f67a040149..d2835a2438 100644 --- a/actionpack/lib/action_view/helpers/form_helper.rb +++ b/actionpack/lib/action_view/helpers/form_helper.rb @@ -32,6 +32,15 @@ module ActionView # <input name="commit" type="submit" value="Create" /> # </form> # + # If you are using a partial for your form fields, you can use this shortcut: + # + # <% form_for :person, @person, :url => { :action => "create" } do |f| %> + # <%= render :partial => f %> + # <%= submit_tag 'Create' %> + # <% end %> + # + # This example will render the <tt>people/_form</tt> partial, setting a local variable called <tt>form</tt> which references the yielded FormBuilder. + # # The <tt>params</tt> object created when this form is submitted would look like: # # {"action"=>"create", "controller"=>"persons", "person"=>{"first_name"=>"William", "last_name"=>"Smith"}} @@ -153,6 +162,12 @@ module ActionView # <%= check_box_tag "person[admin]", @person.company.admin? %> # <% end %> # + # In this case, if you use this: + # + # <%= render :partial => f %> + # + # The rendered template is <tt>people/_labelling_form</tt> and the local variable referencing the form builder is called <tt>labelling_form</tt>. + # # In many cases you will want to wrap the above in another helper, so you could do something like the following: # # def labelled_form_for(record_or_name_or_array, *args, &proc) diff --git a/actionpack/lib/action_view/partials.rb b/actionpack/lib/action_view/partials.rb index 0795b8ec55..a1ba60d560 100644 --- a/actionpack/lib/action_view/partials.rb +++ b/actionpack/lib/action_view/partials.rb @@ -119,6 +119,9 @@ module ActionView else render("#{path}/_#{partial_name}", local_assigns) end + when ActionView::Helpers::FormBuilder + builder_partial_path = partial_path.class.to_s.demodulize.underscore.sub(/_builder$/, '') + render_partial(builder_partial_path, object_assigns, (local_assigns || {}).merge(builder_partial_path.to_sym => partial_path)) when Array, ActiveRecord::Associations::AssociationCollection, ActiveRecord::Associations::HasManyThroughAssociation if partial_path.any? path = ActionController::RecordIdentifier.partial_path(partial_path.first) diff --git a/actionpack/test/controller/new_render_test.rb b/actionpack/test/controller/new_render_test.rb index e06737ee0b..eb19b2e391 100644 --- a/actionpack/test/controller/new_render_test.rb +++ b/actionpack/test/controller/new_render_test.rb @@ -17,6 +17,9 @@ module NewRenderTestHelper end end +class LabellingFormBuilder < ActionView::Helpers::FormBuilder +end + class NewRenderTestController < ActionController::Base layout :determine_layout @@ -136,7 +139,15 @@ class NewRenderTestController < ActionController::Base def partial_with_locals render :partial => "customer", :locals => { :customer => Customer.new("david") } end + + def partial_with_form_builder + render :partial => ActionView::Helpers::FormBuilder.new(:post, nil, @template, nil, Proc.new {}) + end + def partial_with_form_builder_subclass + render :partial => LabellingFormBuilder.new(:post, nil, @template, nil, Proc.new {}) + end + def partial_collection render :partial => "customer", :collection => [ Customer.new("david"), Customer.new("mary") ] end @@ -685,6 +696,18 @@ EOS assert_equal "Hello: david", @response.body end + def test_partial_with_form_builder + get :partial_with_form_builder + assert_match(/<label/, @response.body) + assert_template('test/_form') + end + + def test_partial_with_form_builder_subclass + get :partial_with_form_builder_subclass + assert_match(/<label/, @response.body) + assert_template('test/_labelling_form') + end + def test_partial_collection get :partial_collection assert_equal "Hello: davidHello: mary", @response.body diff --git a/actionpack/test/fixtures/test/_form.erb b/actionpack/test/fixtures/test/_form.erb new file mode 100644 index 0000000000..01107f1cb2 --- /dev/null +++ b/actionpack/test/fixtures/test/_form.erb @@ -0,0 +1 @@ +<%= form.label :title %> diff --git a/actionpack/test/fixtures/test/_labelling_form.erb b/actionpack/test/fixtures/test/_labelling_form.erb new file mode 100644 index 0000000000..1b95763165 --- /dev/null +++ b/actionpack/test/fixtures/test/_labelling_form.erb @@ -0,0 +1 @@ +<%= labelling_form.label :title %> |