From bfe58ac05d4b7ba5d5c04c3aa9a719e340b2111e Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Fri, 7 Aug 2009 11:33:54 -0300 Subject: Get all ActionController partial rendering to use ActionView's partial code. Consequences: * It is not possible to always pre-determine the layout before going to ActionView. This was *already* broken for render :partial => @object, :layout => true. This is now handled by overriding render_to_body in layouts.rb and manually injecting the partial's response. This needs to be done in ActionController since ActionController knows enough to get _layout_for_option. There is probably a better abstraction here. * As a result, all partial rendering can correctly restrict their layouts to the mime type of the rendered partial. This could have previously caused a bug in some edge cases. * If other layout-like options are added, they might need to add special code for the case of render :partial. We should try to think of an alternate solution, if possible, but this works for the cases we know of now. --- actionpack/lib/abstract_controller/layouts.rb | 16 ++++++++++++++++ actionpack/lib/abstract_controller/renderer.rb | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) (limited to 'actionpack/lib/abstract_controller') diff --git a/actionpack/lib/abstract_controller/layouts.rb b/actionpack/lib/abstract_controller/layouts.rb index f021dd8b62..038598a3b3 100644 --- a/actionpack/lib/abstract_controller/layouts.rb +++ b/actionpack/lib/abstract_controller/layouts.rb @@ -88,6 +88,22 @@ module AbstractController end end + def render_to_body(options = {}) + response = super + + if options.key?(:partial) + # This is a little bit messy. We need to explicitly handle partial + # layouts here since the core lookup logic is in the view, but + # we need to determine the layout based on the controller + if options.key?(:layout) + layout = _layout_for_option(options[:layout], options[:_template].details) + response = layout.render(view_context, options[:locals]) { response } + end + end + + response + end + private # This will be overwritten by _write_layout_method def _layout(details) end diff --git a/actionpack/lib/abstract_controller/renderer.rb b/actionpack/lib/abstract_controller/renderer.rb index 73e6b2a4dc..da57d0ff4d 100644 --- a/actionpack/lib/abstract_controller/renderer.rb +++ b/actionpack/lib/abstract_controller/renderer.rb @@ -54,7 +54,7 @@ module AbstractController # :api: plugin def render_to_body(options = {}) # TODO: Refactor so we can just use the normal template logic for this - if options.key?(:_partial_object) + if options.key?(:partial) view_context.render_partial(options) else _determine_template(options) -- cgit v1.2.3