Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Common behavior with adding formats to lookup_context for TemplateRen…

…derer and PartialRenderer
  • Loading branch information...
commit eb19ca3457c7b9908c71376f9b3b4431fcd24c6f 1 parent d00b635
@route route authored
View
7 actionpack/lib/action_view/lookup_context.rb
@@ -96,7 +96,7 @@ def _set_detail(key, value)
# Helpers related to template lookup using the lookup context information.
module ViewPaths
- attr_reader :view_paths
+ attr_reader :view_paths, :html_fallback_for_js
# Whenever setting view paths, makes a copy so we can manipulate then in
# instance objects as we wish.
@@ -184,7 +184,10 @@ def initialize(view_paths, details = {}, prefixes = [])
def formats=(values)
if values
values.concat(default_formats) if values.delete "*/*"
- values << :html if values == [:js]
+ if values == [:js]
+ values << :html
+ @html_fallback_for_js = true
+ end
end
super(values)
end
View
6 actionpack/lib/action_view/renderer/abstract_renderer.rb
@@ -22,5 +22,11 @@ def extract_details(options)
def instrument(name, options={})
ActiveSupport::Notifications.instrument("render_#{name}.action_view", options){ yield }
end
+
+ def prepend_formats(formats)
+ formats = Array(formats)
+ return if formats.empty? || @lookup_context.html_fallback_for_js
+ @lookup_context.formats = formats | @lookup_context.formats
+ end
end
end
View
2  actionpack/lib/action_view/renderer/partial_renderer.rb
@@ -320,6 +320,8 @@ def setup(context, options, block)
@block = block
@details = extract_details(options)
+ prepend_formats(options[:formats])
+
if String === partial
@object = options[:object]
@path = partial
View
5 actionpack/lib/action_view/renderer/template_renderer.rb
@@ -8,9 +8,10 @@ def render(context, options)
template = determine_template(options)
context = @lookup_context
+ prepend_formats(template.formats)
+
unless context.rendered_format
- context.formats = template.formats unless template.formats.empty?
- context.rendered_format = context.formats.first
+ context.rendered_format = template.formats.first || formats.last
end
render_template(template, options[:layout], options[:locals])
View
1  actionpack/test/fixtures/test/_changing_priority.html.erb
@@ -0,0 +1 @@
+HTML
View
1  actionpack/test/fixtures/test/_changing_priority.json.erb
@@ -0,0 +1 @@
+JSON
View
1  actionpack/test/fixtures/test/_first_json_partial.json.erb
@@ -0,0 +1 @@
+<%= render :partial => "test/second_json_partial" %>
View
0  actionpack/test/fixtures/test/_json_change_priority.json.erb
No changes.
View
1  actionpack/test/fixtures/test/_second_json_partial.json.erb
@@ -0,0 +1 @@
+Third level
View
2  actionpack/test/fixtures/test/change_priorty.html.erb
@@ -0,0 +1,2 @@
+<%= render :partial => "test/json_change_priority", formats: :json %>
+HTML Template, but <%= render :partial => "test/changing_priority" %> partial
View
1  actionpack/test/fixtures/test/html_template.html.erb
@@ -0,0 +1 @@
+<%= render :partial => "test/first_json_partial", formats: :json %>
View
10 actionpack/test/template/render_test.rb
@@ -54,6 +54,16 @@ def test_render_partial_implicitly_use_format_of_the_rendered_template
assert_equal "Hello world", @view.render(:template => "test/one", :formats => [:html])
end
+ def test_render_partial_implicitly_use_format_of_the_rendered_partial
+ @view.lookup_context.formats = [:html]
+ assert_equal "Third level", @view.render(:template => "test/html_template")
+ end
+
+ def test_render_partial_use_last_prepended_format_for_partials_with_the_same_names
+ @view.lookup_context.formats = [:html]
+ assert_equal "\nHTML Template, but JSON partial", @view.render(:template => "test/change_priorty")
+ end
+
def test_render_template_with_a_missing_partial_of_another_format
@view.lookup_context.formats = [:html]
assert_raise ActionView::Template::Error, "Missing partial /missing with {:locale=>[:en], :formats=>[:json], :handlers=>[:erb, :builder]}" do
Please sign in to comment.
Something went wrong with that request. Please try again.