aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/lookup_context.rb
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2010-06-07 10:13:41 +0200
committerJosé Valim <jose.valim@gmail.com>2010-06-07 10:13:41 +0200
commit5273bd97e6746bd5bdc2450ad5a2d60f6a6eb7ae (patch)
tree23d99be0735ada0ea0be1b84fdca31cf449263d3 /actionpack/lib/action_view/lookup_context.rb
parentb3d2080278fc2b17d64010c3bfb149a08583b667 (diff)
downloadrails-5273bd97e6746bd5bdc2450ad5a2d60f6a6eb7ae.tar.gz
rails-5273bd97e6746bd5bdc2450ad5a2d60f6a6eb7ae.tar.bz2
rails-5273bd97e6746bd5bdc2450ad5a2d60f6a6eb7ae.zip
Make AP test suite green once again and speed up performance in layouts lookup for some cases.
Diffstat (limited to 'actionpack/lib/action_view/lookup_context.rb')
-rw-r--r--actionpack/lib/action_view/lookup_context.rb51
1 files changed, 33 insertions, 18 deletions
diff --git a/actionpack/lib/action_view/lookup_context.rb b/actionpack/lib/action_view/lookup_context.rb
index 801b08b19d..3aaa5e401c 100644
--- a/actionpack/lib/action_view/lookup_context.rb
+++ b/actionpack/lib/action_view/lookup_context.rb
@@ -19,6 +19,7 @@ module ActionView
def self.register_detail(name, options = {}, &block)
self.registered_details << name
self.registered_detail_setters << [name, "#{name}="]
+
Accessors.send :define_method, :"_#{name}_defaults", &block
Accessors.module_eval <<-METHOD, __FILE__, __LINE__ + 1
def #{name}
@@ -27,12 +28,7 @@ module ActionView
def #{name}=(value)
value = Array.wrap(value.presence || _#{name}_defaults)
-
- if value != @details[:#{name}]
- @details_key = nil
- @details = @details.dup if @details.frozen?
- @details[:#{name}] = value.freeze
- end
+ _set_detail(:#{name}, value) if value != @details[:#{name}]
end
METHOD
end
@@ -63,8 +59,11 @@ module ActionView
def initialize(view_paths, details = {})
@details, @details_key = { :handlers => default_handlers }, nil
@frozen_formats, @skip_default_locale = false, false
+
self.view_paths = view_paths
- self.initialize_details(details)
+ self.registered_detail_setters.each do |key, setter|
+ send(setter, details[key])
+ end
end
module ViewPaths
@@ -177,11 +176,20 @@ module ActionView
super(@skip_default_locale ? I18n.locale : _locale_defaults)
end
- def initialize_details(details)
- details = details.dup
-
- registered_detail_setters.each do |key, setter|
- send(setter, details[key])
+ # A method which only uses the first format in the formats array for layout lookup.
+ # This method plays straight with instance variables for performance reasons.
+ def with_layout_format
+ if formats.size == 1
+ yield
+ else
+ old_formats = formats
+ _set_detail(:formats, formats[0,1])
+
+ begin
+ yield
+ ensure
+ _set_detail(:formats, formats)
+ end
end
end
@@ -195,14 +203,21 @@ module ActionView
send(setter, new_details[key]) if new_details.key?(key)
end
- if block_given?
- begin
- yield
- ensure
- @details = old_details
- end
+ begin
+ yield
+ ensure
+ @details_key = nil
+ @details = old_details
end
end
+
+ protected
+
+ def _set_detail(key, value)
+ @details_key = nil
+ @details = @details.dup if @details.frozen?
+ @details[key] = value.freeze
+ end
end
include Accessors