aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/abstract_controller
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2010-03-07 19:41:58 +0100
committerJosé Valim <jose.valim@gmail.com>2010-03-07 19:41:58 +0100
commitc7564d74e8a9b451f9fc78566ab0c734671f9612 (patch)
treec903fd5650626a79f53c89ccb1b8e10e1052bae6 /actionpack/lib/abstract_controller
parent6e0443fd433393dc1967fab4f4fa06dc2b3c02fd (diff)
downloadrails-c7564d74e8a9b451f9fc78566ab0c734671f9612.tar.gz
rails-c7564d74e8a9b451f9fc78566ab0c734671f9612.tar.bz2
rails-c7564d74e8a9b451f9fc78566ab0c734671f9612.zip
Added template lookup responsible to hold all information used in template lookup.
Diffstat (limited to 'actionpack/lib/abstract_controller')
-rw-r--r--actionpack/lib/abstract_controller/compatibility.rb2
-rw-r--r--actionpack/lib/abstract_controller/details_cache.rb48
-rw-r--r--actionpack/lib/abstract_controller/layouts.rb37
-rw-r--r--actionpack/lib/abstract_controller/rendering.rb42
4 files changed, 31 insertions, 98 deletions
diff --git a/actionpack/lib/abstract_controller/compatibility.rb b/actionpack/lib/abstract_controller/compatibility.rb
index 7fb93a0eb5..85fb1364b7 100644
--- a/actionpack/lib/abstract_controller/compatibility.rb
+++ b/actionpack/lib/abstract_controller/compatibility.rb
@@ -11,7 +11,7 @@ module AbstractController
def _default_layout(details, require_layout = false)
super
rescue ActionView::MissingTemplate
- _find_layout(_layout({}), {})
+ _layout_for_name(_layout({}), {})
nil
end
end
diff --git a/actionpack/lib/abstract_controller/details_cache.rb b/actionpack/lib/abstract_controller/details_cache.rb
deleted file mode 100644
index be1a1c0f34..0000000000
--- a/actionpack/lib/abstract_controller/details_cache.rb
+++ /dev/null
@@ -1,48 +0,0 @@
-module AbstractController
- class HashKey
- @hash_keys = Hash.new {|h,k| h[k] = {} }
-
- def self.get(klass, details)
- @hash_keys[klass][details] ||= new(klass, details)
- end
-
- attr_reader :hash
- alias_method :eql?, :equal?
-
- def initialize(klass, details)
- @details, @hash = details, details.hash
- end
-
- def inspect
- "#<HashKey -- details: #{@details.inspect}>"
- end
- end
-
- module DetailsCache
- extend ActiveSupport::Concern
-
- module ClassMethods
- def clear_template_caches!
- ActionView::Partials::PartialRenderer::TEMPLATES.clear
- template_cache.clear
- super
- end
-
- def template_cache
- @template_cache ||= Hash.new {|h,k| h[k] = {} }
- end
- end
-
- def render_to_body(*args)
- Thread.current[:format_locale_key] = HashKey.get(self.class, details_for_render)
- super
- end
-
- private
-
- def with_template_cache(name, details)
- self.class.template_cache[HashKey.get(self.class, details)][name] ||= super
- end
-
- end
-end
diff --git a/actionpack/lib/abstract_controller/layouts.rb b/actionpack/lib/abstract_controller/layouts.rb
index beda4e633e..c26593dd19 100644
--- a/actionpack/lib/abstract_controller/layouts.rb
+++ b/actionpack/lib/abstract_controller/layouts.rb
@@ -170,27 +170,7 @@ module AbstractController
module ClassMethods
def inherited(klass)
super
- klass.class_eval do
- _write_layout_method
- @found_layouts = {}
- end
- end
-
- def clear_template_caches!
- @found_layouts.clear if defined? @found_layouts
- super
- end
-
- def cache_layout(details)
- layout = @found_layouts
- key = Thread.current[:format_locale_key]
-
- # Cache nil
- if layout.key?(key)
- return layout[key]
- else
- layout[key] = yield
- end
+ klass._write_layout_method
end
# This module is mixed in if layout conditions are provided. This means
@@ -282,12 +262,10 @@ module AbstractController
if name
self.class_eval <<-RUBY, __FILE__, __LINE__ + 1
def _layout(details)
- self.class.cache_layout(details) do
- if template_exists?("#{_implied_layout_name}", details, :_prefix => "layouts")
- "#{_implied_layout_name}"
- else
- super
- end
+ if template_exists?("#{_implied_layout_name}", :_prefix => "layouts")
+ "#{_implied_layout_name}"
+ else
+ super
end
end
RUBY
@@ -372,9 +350,10 @@ module AbstractController
# ==== Returns
# Template:: A template object matching the name and details
def _find_layout(name, details)
- # TODO: Make prefix actually part of details in ViewPath#find_by_parts
prefix = details.key?(:prefix) ? details.delete(:prefix) : "layouts"
- find_template(name, details, :_prefix => prefix)
+ # TODO This should happen automatically
+ template_lookup.details = template_lookup.details.merge(:formats => details[:formats])
+ find_template(name, :_prefix => prefix)
end
# Returns the default layout for this controller and a given set of details.
diff --git a/actionpack/lib/abstract_controller/rendering.rb b/actionpack/lib/abstract_controller/rendering.rb
index 2ea4f02871..df33e8b480 100644
--- a/actionpack/lib/abstract_controller/rendering.rb
+++ b/actionpack/lib/abstract_controller/rendering.rb
@@ -90,10 +90,22 @@ module AbstractController
view_context.render_partial(options)
end
+ def template_lookup
+ @template_lookup ||= ActionView::Template::Lookup.new(_view_paths, details_for_render)
+ end
+
# The list of view paths for this controller. See ActionView::ViewPathSet for
# more details about writing custom view paths.
def view_paths
- _view_paths
+ template_lookup.view_paths
+ end
+
+ def append_view_path(path)
+ template_lookup.view_paths.push(*path)
+ end
+
+ def prepend_view_path(path)
+ template_lookup.view_paths.unshift(*path)
end
# The prefix used in render "foo" shortcuts.
@@ -162,10 +174,9 @@ module AbstractController
options[:_prefix] ||= _prefix if (options.keys & [:partial, :file, :template]).empty?
details = _normalize_details(options)
+ template_lookup.details = details
- options[:_template] ||= with_template_cache(name, details) do
- find_template(name, details, options)
- end
+ options[:_template] ||= find_template(name, options)
end
def details_for_render
@@ -179,16 +190,12 @@ module AbstractController
details
end
- def find_template(name, details, options)
- view_paths.find(name, details, options[:_prefix], options[:_partial])
- end
-
- def template_exists?(name, details, options)
- view_paths.exists?(name, details, options[:_prefix], options[:_partial])
+ def find_template(name, options)
+ template_lookup.find(name, options[:_prefix], options[:_partial])
end
- def with_template_cache(name, details)
- yield
+ def template_exists?(name, options)
+ template_lookup.exists?(name, options[:_prefix], options[:_partial])
end
def format_for_text
@@ -196,9 +203,6 @@ module AbstractController
end
module ClassMethods
- def clear_template_caches!
- end
-
# Append a path to the list of view paths for this controller.
#
# ==== Parameters
@@ -206,7 +210,7 @@ module AbstractController
# the default view path. You may also provide a custom view path
# (see ActionView::ViewPathSet for more information)
def append_view_path(path)
- self.view_paths = view_paths.dup + Array.wrap(path)
+ self.view_paths = view_paths.dup + Array(path)
end
# Prepend a path to the list of view paths for this controller.
@@ -216,8 +220,7 @@ module AbstractController
# the default view path. You may also provide a custom view path
# (see ActionView::ViewPathSet for more information)
def prepend_view_path(path)
- clear_template_caches!
- self.view_paths = Array.wrap(path) + view_paths.dup
+ self.view_paths = Array(path) + view_paths.dup
end
# A list of all of the default view paths for this controller.
@@ -231,9 +234,8 @@ module AbstractController
# paths<ViewPathSet, Object>:: If a ViewPathSet is provided, use that;
# otherwise, process the parameter into a ViewPathSet.
def view_paths=(paths)
- clear_template_caches!
self._view_paths = paths.is_a?(ActionView::PathSet) ? paths : ActionView::Base.process_view_paths(paths)
- _view_paths.freeze
+ self._view_paths.freeze
end
end
end