aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/abstract_controller/layouts.rb
diff options
context:
space:
mode:
authorYehuda Katz <wycats@gmail.com>2009-08-09 09:46:50 -0300
committerYehuda Katz <wycats@gmail.com>2009-08-11 15:03:52 -0700
commit02d9dd900048407ef555cf09b0038a57ae924b0a (patch)
treec94879aa6c0dcdd82226114e31cefdb7abac7678 /actionpack/lib/abstract_controller/layouts.rb
parent04d4537cd40d0415d15af4395213632735c8683f (diff)
downloadrails-02d9dd900048407ef555cf09b0038a57ae924b0a.tar.gz
rails-02d9dd900048407ef555cf09b0038a57ae924b0a.tar.bz2
rails-02d9dd900048407ef555cf09b0038a57ae924b0a.zip
Add some more caching to the lookup
Diffstat (limited to 'actionpack/lib/abstract_controller/layouts.rb')
-rw-r--r--actionpack/lib/abstract_controller/layouts.rb22
1 files changed, 18 insertions, 4 deletions
diff --git a/actionpack/lib/abstract_controller/layouts.rb b/actionpack/lib/abstract_controller/layouts.rb
index 0063d54149..d7317b415c 100644
--- a/actionpack/lib/abstract_controller/layouts.rb
+++ b/actionpack/lib/abstract_controller/layouts.rb
@@ -15,6 +15,18 @@ module AbstractController
klass._write_layout_method
end
+ def cache_layout(details)
+ layout = @found_layouts ||= {}
+ values = details.values_at(:formats, :locale)
+
+ # Cache nil
+ if layout.key?(values)
+ return layout[values]
+ else
+ layout[values] = yield
+ end
+ end
+
# Specify the layout to use for this class.
#
# If the specified layout is a:
@@ -76,10 +88,12 @@ module AbstractController
when nil
self.class_eval <<-ruby_eval, __FILE__, __LINE__ + 1
def _layout(details)
- if view_paths.exists?("#{_implied_layout_name}", details, "layouts")
- "#{_implied_layout_name}"
- else
- super
+ self.class.cache_layout(details) do
+ if view_paths.exists?("#{_implied_layout_name}", details, "layouts")
+ "#{_implied_layout_name}"
+ else
+ super
+ end
end
end
ruby_eval