diff options
author | José Valim <jose.valim@gmail.com> | 2010-06-07 10:13:41 +0200 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2010-06-07 10:13:41 +0200 |
commit | 5273bd97e6746bd5bdc2450ad5a2d60f6a6eb7ae (patch) | |
tree | 23d99be0735ada0ea0be1b84fdca31cf449263d3 /actionpack/lib/action_view/lookup_context.rb | |
parent | b3d2080278fc2b17d64010c3bfb149a08583b667 (diff) | |
download | rails-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.rb | 51 |
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 |