Skip to content

Commit

Permalink
format lookup for partials is derived from the format in which the te…
Browse files Browse the repository at this point in the history
…mplate is being rendered

Closes #5025 part 2
  • Loading branch information
spastorino committed Feb 22, 2012
1 parent 35626fe commit 19433ce
Show file tree
Hide file tree
Showing 11 changed files with 25 additions and 36 deletions.
4 changes: 2 additions & 2 deletions actionmailer/lib/action_mailer/collector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ def any(*args, &block)

def custom(mime, options={})
options.reverse_merge!(:content_type => mime.to_s)
@context.freeze_formats([mime.to_sym])
@context.formats = [mime.to_sym]
options[:body] = block_given? ? yield : @default_render.call
@responses << options
end
end
end
end
2 changes: 1 addition & 1 deletion actionpack/lib/action_controller/metal/mime_responds.rb
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,7 @@ def retrieve_collector_from_mimes(mimes=nil, &block) #:nodoc:

if format
self.content_type ||= format.to_s
lookup_context.freeze_formats([format.to_sym])
lookup_context.formats = [format.to_sym]
collector
else
head :not_acceptable
Expand Down
2 changes: 1 addition & 1 deletion actionpack/lib/action_controller/metal/rendering.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def process_action(*) #:nodoc:
def render(*args) #:nodoc:
raise ::AbstractController::DoubleRenderError if response_body
super
self.content_type ||= Mime[formats.first].to_s
self.content_type ||= Mime[lookup_context.rendered_format].to_s
response_body
end

Expand Down
14 changes: 3 additions & 11 deletions actionpack/lib/action_view/lookup_context.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ module ActionView
# generate a key, given to view paths, used in the resolver cache lookup. Since
# this key is generated just once during the request, it speeds up all cache accesses.
class LookupContext #:nodoc:
attr_accessor :prefixes
attr_accessor :prefixes, :rendered_format

mattr_accessor :fallbacks
@@fallbacks = FallbackFileSystemResolver.instances
Expand Down Expand Up @@ -180,23 +180,15 @@ def handlers_regexp #:nodoc:

def initialize(view_paths, details = {}, prefixes = [])
@details, @details_key = {}, nil
@frozen_formats, @skip_default_locale = false, false
@skip_default_locale = false
@cache = true
@prefixes = prefixes
@rendered_format = nil

self.view_paths = view_paths
initialize_details(details)
end

# Freeze the current formats in the lookup context. By freezing them, you are guaranteeing
# that next template lookups are not going to modify the formats. The controller can also
# use this, to ensure that formats won't be further modified (as it does in respond_to blocks).
def freeze_formats(formats, unless_frozen=false) #:nodoc:
return if unless_frozen && @frozen_formats
self.formats = formats
@frozen_formats = true
end

# Override formats= to expand ["*/*"] values and automatically
# add :html as fallback to :js.
def formats=(values)
Expand Down
2 changes: 1 addition & 1 deletion actionpack/lib/action_view/renderer/abstract_renderer.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module ActionView
class AbstractRenderer #:nodoc:
delegate :find_template, :template_exists?, :with_fallbacks, :update_details,
:with_layout_format, :formats, :freeze_formats, :to => :@lookup_context
:with_layout_format, :formats, :to => :@lookup_context

def initialize(lookup_context)
@lookup_context = lookup_context
Expand Down
3 changes: 2 additions & 1 deletion actionpack/lib/action_view/renderer/template_renderer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ def render(context, options)
@details = extract_details(options)
extract_format(options[:file] || options[:template], @details)
template = determine_template(options)
freeze_formats(template.formats, true)
@lookup_context.rendered_format ||= template.formats.first
@lookup_context.formats = template.formats
render_template(template, options[:layout], options[:locals])
end

Expand Down
17 changes: 6 additions & 11 deletions actionpack/lib/action_view/template.rb
Original file line number Diff line number Diff line change
Expand Up @@ -160,17 +160,12 @@ def mime_type
# virtual path set (true just for inline templates).
def refresh(view)
raise "A template needs to have a virtual path in order to be refreshed" unless @virtual_path
begin
lookup = view.lookup_context
pieces = @virtual_path.split("/")
name = pieces.pop
partial = !!name.sub!(/^_/, "")
previous_formats, lookup.formats = lookup.formats, @formats
lookup.disable_cache do
lookup.find_template(name, [ pieces.join('/') ], partial, @locals)
end
ensure
lookup.formats = previous_formats
lookup = view.lookup_context
pieces = @virtual_path.split("/")
name = pieces.pop
partial = !!name.sub!(/^_/, "")
lookup.disable_cache do
lookup.find_template(name, [ pieces.join('/') ], partial, @locals)
end
end

Expand Down
4 changes: 0 additions & 4 deletions actionpack/lib/action_view/template/handlers/erb.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,6 @@ class ERB
class_attribute :erb_trim_mode
self.erb_trim_mode = '-'

# Default format used by ERB.
class_attribute :default_format
self.default_format = Mime::HTML

# Default implementation used.
class_attribute :erb_implementation
self.erb_implementation = Erubis
Expand Down
1 change: 1 addition & 0 deletions actionpack/test/fixtures/test/one.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<%= render :partial => "test/two" %> world
4 changes: 2 additions & 2 deletions actionpack/test/template/lookup_context_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ def teardown
end

test "found templates respects given formats if one cannot be found from template or handler" do
ActionView::Template::Handlers::ERB.expects(:default_format).returns(nil)
ActionView::Template::Handlers::Builder.expects(:default_format).returns(nil)
@lookup_context.formats = [:text]
template = @lookup_context.find("hello_world", %w(test))
template = @lookup_context.find("hello", %w(test))
assert_equal [:text], template.formats
end

Expand Down
8 changes: 6 additions & 2 deletions actionpack/test/template/render_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,16 @@ def test_render_template_with_format
assert_match "<error>No Comment</error>", @view.render(:template => "comments/empty", :formats => [:xml])
end

def test_render_partial_implicitly_use_format_of_the_rendered_template
@view.lookup_context.formats = [:json]
assert_equal "Hello world", @view.render(:template => "test/one", :formats => [:html])
end

def test_render_template_with_a_missing_partial_of_another_format
@view.lookup_context.freeze_formats([:html])
@view.lookup_context.formats = [:html]
assert_raise ActionView::Template::Error, "Missing partial /missing with {:locale=>[:en], :formats=>[:json], :handlers=>[:erb, :builder]}" do
@view.render(:template => "with_format", :formats => [:json])
end
assert_equal [:html], @view.lookup_context.formats
end

def test_render_file_with_locale
Expand Down

0 comments on commit 19433ce

Please sign in to comment.