aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2008-11-27 21:04:24 +0100
committerDavid Heinemeier Hansson <david@loudthinking.com>2008-11-27 21:04:24 +0100
commit5fa0457542b0ff541d0a80ff8c3561eec8e35959 (patch)
tree02264b718d54ffb2a513ad9a05bf2c7a6f572589 /actionpack/lib/action_controller
parent6fa9957e0e83f327aaffe34679a5752fc2343fae (diff)
downloadrails-5fa0457542b0ff541d0a80ff8c3561eec8e35959.tar.gz
rails-5fa0457542b0ff541d0a80ff8c3561eec8e35959.tar.bz2
rails-5fa0457542b0ff541d0a80ff8c3561eec8e35959.zip
Revert "Super lazy load view paths in development mode (no indexing or caching at all). Switch layout finders to use view path api to take advantage of cache." as it killed dev mode reloading.
This reverts commit 4d910b033379727e5e7355590c50c72fc75e56db.
Diffstat (limited to 'actionpack/lib/action_controller')
-rw-r--r--actionpack/lib/action_controller/base.rb5
-rw-r--r--actionpack/lib/action_controller/dispatcher.rb1
-rw-r--r--actionpack/lib/action_controller/layout.rb38
3 files changed, 31 insertions, 13 deletions
diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb
index dca66ff0a5..7e38f95076 100644
--- a/actionpack/lib/action_controller/base.rb
+++ b/actionpack/lib/action_controller/base.rb
@@ -867,9 +867,8 @@ module ActionController #:nodoc:
end
end
- layout = pick_layout(options)
- response.layout = layout.path_without_format_and_extension if layout
- logger.info("Rendering template within #{layout.path_without_format_and_extension}") if logger && layout
+ response.layout = layout = pick_layout(options)
+ logger.info("Rendering template within #{layout}") if logger && layout
if content_type = options[:content_type]
response.content_type = content_type.to_s
diff --git a/actionpack/lib/action_controller/dispatcher.rb b/actionpack/lib/action_controller/dispatcher.rb
index 6e4aba2280..1c7a4b0545 100644
--- a/actionpack/lib/action_controller/dispatcher.rb
+++ b/actionpack/lib/action_controller/dispatcher.rb
@@ -137,6 +137,7 @@ module ActionController
run_callbacks :prepare_dispatch
Routing::Routes.reload
+ ActionController::Base.view_paths.reload!
ActionView::Helpers::AssetTagHelper::AssetTag::Cache.clear
end
diff --git a/actionpack/lib/action_controller/layout.rb b/actionpack/lib/action_controller/layout.rb
index 54108df06d..3631ce86af 100644
--- a/actionpack/lib/action_controller/layout.rb
+++ b/actionpack/lib/action_controller/layout.rb
@@ -175,12 +175,13 @@ module ActionController #:nodoc:
def default_layout(format) #:nodoc:
layout = read_inheritable_attribute(:layout)
return layout unless read_inheritable_attribute(:auto_layout)
- find_layout(layout, format)
+ @default_layout ||= {}
+ @default_layout[format] ||= default_layout_with_format(format, layout)
+ @default_layout[format]
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)
+ def layout_list #:nodoc:
+ Array(view_paths).sum([]) { |path| Dir["#{path}/layouts/**/*"] }
end
private
@@ -188,7 +189,7 @@ module ActionController #:nodoc:
inherited_without_layout(child)
unless child.name.blank?
layout_match = child.name.underscore.sub(/_controller$/, '').sub(/^controllers\//, '')
- child.layout(layout_match, {}, true) if child.find_layout(layout_match, :all)
+ child.layout(layout_match, {}, true) unless child.layout_list.grep(%r{layouts/#{layout_match}(\.[a-z][0-9a-z]*)+$}).empty?
end
end
@@ -199,6 +200,15 @@ module ActionController #:nodoc:
def normalize_conditions(conditions)
conditions.inject({}) {|hash, (key, value)| hash.merge(key => [value].flatten.map {|action| action.to_s})}
end
+
+ def default_layout_with_format(format, layout)
+ list = layout_list
+ if list.grep(%r{layouts/#{layout}\.#{format}(\.[a-z][0-9a-z]*)+$}).empty?
+ (!list.grep(%r{layouts/#{layout}\.([a-z][0-9a-z]*)+$}).empty? && format == :html) ? layout : nil
+ else
+ layout
+ end
+ end
end
# Returns the name of the active layout. If the layout was specified as a method reference (through a symbol), this method
@@ -207,18 +217,20 @@ module ActionController #:nodoc:
# 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)
-
active_layout = case layout
+ when String then layout
when Symbol then __send__(layout)
when Proc then layout.call(self)
- else layout
end
+ # Explicitly passed layout names with slashes are looked up relative to the template root,
+ # but auto-discovered layouts derived from a nested controller will contain a slash, though be relative
+ # to the 'layouts' directory so we have to check the file system to infer which case the layout name came from.
if active_layout
- if layout = self.class.find_layout(active_layout, @template.template_format)
- layout
+ if active_layout.include?('/') && ! layout_directory?(active_layout)
+ active_layout
else
- raise ActionView::MissingTemplate.new(self.class.view_paths, active_layout)
+ "layouts/#{active_layout}"
end
end
end
@@ -259,6 +271,12 @@ module ActionController #:nodoc:
end
end
+ def layout_directory?(layout_name)
+ @template.__send__(:_pick_template, "#{File.join('layouts', layout_name)}.#{@template.template_format}") ? true : false
+ rescue ActionView::MissingTemplate
+ false
+ end
+
def default_template_format
response.template.template_format
end