Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Get all ActionController partial rendering to use ActionView's partia…

…l 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.
  • Loading branch information...
commit bfe58ac05d4b7ba5d5c04c3aa9a719e340b2111e 1 parent 606e950
Yehuda Katz wycats authored
16 actionpack/lib/abstract_controller/layouts.rb
View
@@ -88,6 +88,22 @@ def _layout(details)
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
2  actionpack/lib/abstract_controller/renderer.rb
View
@@ -54,7 +54,7 @@ def render(*args)
# :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)
15 actionpack/lib/action_controller/metal/renderer.rb
View
@@ -22,7 +22,8 @@ def render_to_body(options)
_process_options(options)
if options.key?(:partial)
- _render_partial(options[:partial], options)
+ options[:partial] = action_name if options[:partial] == true
+ options[:_details] = {:formats => formats}
end
super
@@ -53,18 +54,6 @@ def _determine_template(options)
end
def _render_partial(partial, options)
- case partial
- when true
- options[:_prefix] = _prefix
- when String
- options[:_prefix] = _prefix unless partial.include?(?/)
- options[:_template_name] = partial
- else
- options[:_partial_object] = true
- return
- end
-
- options[:_partial] = options[:object] || true
end
def _process_options(options)
4 actionpack/lib/action_view/render/partials.rb
View
@@ -185,6 +185,8 @@ def _partial_names
def render_partial(options)
@assigns_added = false
+ # TODO: Handle other details here.
+ self.formats = options[:_details][:formats]
_render_partial(options)
end
@@ -235,6 +237,8 @@ def _render_partial_object(template, options, &block)
end
def _render_partial_collection(collection, options = {}, template = nil, &block) #:nodoc:
+ options[:_template] ||= template
+
return nil if collection.blank?
if options.key?(:spacer_template)
Please sign in to comment.
Something went wrong with that request. Please try again.