Skip to content

Commit

Permalink
make action_controller/layouts pick templates from the current instan…
Browse files Browse the repository at this point in the history
…ce's view_paths instead of the class view_paths [rails#1974 state:resolved]

Signed-off-by: Joshua Peek <josh@joshpeek.com>
  • Loading branch information
Sven Fuchs authored and josh committed Feb 20, 2009
1 parent 01c818e commit 8c5cc66
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 32 deletions.
58 changes: 26 additions & 32 deletions actionpack/lib/action_controller/layout.rb
Original file line number Diff line number Diff line change
Expand Up @@ -172,23 +172,10 @@ def layout_conditions #:nodoc:
@layout_conditions ||= read_inheritable_attribute(:layout_conditions)
end

def default_layout(format) #:nodoc:
layout = read_inheritable_attribute(:layout) unless format == :js
return layout unless read_inheritable_attribute(:auto_layout)
find_layout(layout, format)
end

def layout_list #:nodoc:
Array(view_paths).sum([]) { |path| Dir["#{path.to_str}/layouts/**/*"] }
end

def find_layout(layout, *formats) #:nodoc:
return layout if layout.respond_to?(:render)
view_paths.find_template(layout.to_s =~ /layouts\// ? layout : "layouts/#{layout}", *formats)
rescue ActionView::MissingTemplate
nil
end

private
def inherited_with_layout(child)
inherited_without_layout(child)
Expand All @@ -212,35 +199,29 @@ def normalize_conditions(conditions)
# object). If the layout was defined without a directory, layouts is assumed. So <tt>layout "weblog/standard"</tt> will return
# weblog/standard, but <tt>layout "standard"</tt> will return layouts/standard.
def active_layout(passed_layout = nil)
layout = passed_layout || self.class.default_layout(default_template_format)
layout = passed_layout || default_layout
return layout if layout.respond_to?(:render)

active_layout = case layout
when Symbol then __send__(layout)
when Proc then layout.call(self)
else layout
end

if active_layout
if layout = self.class.find_layout(active_layout, @template.template_format)
layout
else
raise ActionView::MissingTemplate.new(self.class.view_paths, active_layout)
end
end

find_layout(active_layout, @template.template_format) if active_layout
end

private
def candidate_for_layout?(options)
template = options[:template] || default_template(options[:action])
if options.values_at(:text, :xml, :json, :file, :inline, :partial, :nothing, :update).compact.empty?
begin
!self.view_paths.find_template(template, default_template_format).exempt_from_layout?
rescue ActionView::MissingTemplate
true
end
end
def default_layout #:nodoc:
layout = self.class.read_inheritable_attribute(:layout) unless default_template_format == :js
return layout unless self.class.read_inheritable_attribute(:auto_layout)
find_layout(layout, default_template_format)
rescue ActionView::MissingTemplate
false
nil
end

def find_layout(layout, *formats) #:nodoc:
view_paths.find_template(layout.to_s =~ /layouts\// ? layout : "layouts/#{layout}", *formats)
end

def pick_layout(options)
Expand Down Expand Up @@ -273,6 +254,19 @@ def action_has_layout?
end
end

def candidate_for_layout?(options)
template = options[:template] || default_template(options[:action])
if options.values_at(:text, :xml, :json, :file, :inline, :partial, :nothing, :update).compact.empty?
begin
!self.view_paths.find_template(template, default_template_format).exempt_from_layout?
rescue ActionView::MissingTemplate
true
end
end
rescue ActionView::MissingTemplate
false
end

def default_template_format
response.template.template_format
end
Expand Down
14 changes: 14 additions & 0 deletions actionpack/test/controller/layout_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,13 @@ class HasOwnLayoutController < LayoutTest
layout 'item'
end

class PrependsViewPathController < LayoutTest
def hello
prepend_view_path File.dirname(__FILE__) + '/../fixtures/layout_tests/alt/'
render :layout => 'alt'
end
end

class SetsLayoutInRenderController < LayoutTest
def hello
render :layout => 'third_party_template_library'
Expand Down Expand Up @@ -130,6 +137,12 @@ def test_exempt_from_layout_honored_by_render_template
ensure
ActionController::Base.exempt_from_layout.delete(/\.rhtml$/)
end

def test_layout_is_picked_from_the_controller_instances_view_path
@controller = PrependsViewPathController.new
get :hello
assert_equal 'layouts/alt', @response.layout
end
end

class RenderWithTemplateOptionController < LayoutTest
Expand Down Expand Up @@ -178,3 +191,4 @@ def test_symlinked_layout_is_rendered
end
end
end

Empty file.

0 comments on commit 8c5cc66

Please sign in to comment.