1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Common behavior with adding formats to lookup_context for TemplateRenderer and PartialRenderer

This commit is contained in:
Dmitry Vorotilin 2012-07-11 12:18:52 +04:00
parent d00b635242
commit eb19ca3457
12 changed files with 33 additions and 4 deletions

View file

@ -96,7 +96,7 @@ module ActionView
# 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 @@ module ActionView
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 file

@ -22,5 +22,11 @@ module ActionView
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 file

@ -320,6 +320,8 @@ module ActionView
@block = block
@details = extract_details(options)
prepend_formats(options[:formats])
if String === partial
@object = options[:object]
@path = partial

View file

@ -8,9 +8,10 @@ module ActionView
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 file

@ -0,0 +1 @@
HTML

View file

@ -0,0 +1 @@
JSON

View file

@ -0,0 +1 @@
<%= render :partial => "test/second_json_partial" %>

View file

@ -0,0 +1 @@
Third level

View file

@ -0,0 +1,2 @@
<%= render :partial => "test/json_change_priority", formats: :json %>
HTML Template, but <%= render :partial => "test/changing_priority" %> partial

View file

@ -0,0 +1 @@
<%= render :partial => "test/first_json_partial", formats: :json %>

View file

@ -54,6 +54,16 @@ module RenderTestCases
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