Extracted localized_cache.rb from ActionController, added it to AbstractController and made ActionMailer use it.

This commit is contained in:
José Valim 2009-10-28 10:33:05 -02:00 committed by Yehuda Katz
parent a107103e85
commit 976c264724
6 changed files with 113 additions and 40 deletions

View File

@ -254,6 +254,7 @@ module ActionMailer #:nodoc:
include AdvAttrAccessor, PartContainer, Quoting, Utils
include AbstractController::RenderingController
include AbstractController::LocalizedCache
include AbstractController::Layouts
include AbstractController::Helpers

View File

@ -6,6 +6,7 @@ module AbstractController
autoload :Callbacks, "abstract_controller/callbacks"
autoload :Helpers, "abstract_controller/helpers"
autoload :Layouts, "abstract_controller/layouts"
autoload :LocalizedCache, "abstract_controller/localized_cache"
autoload :Logger, "abstract_controller/logger"
autoload :RenderingController, "abstract_controller/rendering_controller"
# === Exceptions

View File

@ -0,0 +1,49 @@
module AbstractController
class HashKey
@hash_keys = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = {} } }
def self.get(klass, formats, locale)
@hash_keys[klass][formats][locale] ||= new(klass, formats, locale)
end
attr_accessor :hash
def initialize(klass, formats, locale)
@formats, @locale = formats, locale
@hash = [formats, locale].hash
end
alias_method :eql?, :equal?
def inspect
"#<HashKey -- formats: #{@formats.inspect} locale: #{@locale.inspect}>"
end
end
module LocalizedCache
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(options)
Thread.current[:format_locale_key] = HashKey.get(self.class, formats, I18n.locale)
super
end
private
def with_template_cache(name)
self.class.template_cache[Thread.current[:format_locale_key]][name] ||= super
end
end
end

View File

@ -1,39 +1,10 @@
module ActionController
class HashKey
@hash_keys = Hash.new {|h,k| h[k] = Hash.new {|h,k| h[k] = {} } }
def self.get(klass, formats, locale)
@hash_keys[klass][formats][locale] ||= new(klass, formats, locale)
end
attr_accessor :hash
def initialize(klass, formats, locale)
@formats, @locale = formats, locale
@hash = [formats, locale].hash
end
alias_method :eql?, :equal?
def inspect
"#<HashKey -- formats: #{@formats} locale: #{@locale}>"
end
end
module RenderingController
extend ActiveSupport::Concern
include AbstractController::RenderingController
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
included do
include AbstractController::RenderingController
include AbstractController::LocalizedCache
end
def process_action(*)
@ -42,8 +13,6 @@ module ActionController
end
def render(options)
Thread.current[:format_locale_key] = HashKey.get(self.class, formats, I18n.locale)
super
self.content_type ||= options[:_template].mime_type.to_s
response_body
@ -78,10 +47,6 @@ module ActionController
formats.first
end
def with_template_cache(name)
self.class.template_cache[Thread.current[:format_locale_key]][name] ||= super
end
def _process_options(options)
status, content_type, location = options.values_at(:status, :content_type, :location)
self.status = status if status

View File

@ -187,11 +187,11 @@ module ActionView #:nodoc:
def reset_formats(formats)
@formats = formats
if defined?(ActionController)
if defined?(AbstractController::HashKey)
# This is expensive, but we need to reset this when the format is updated,
# which currently only happens
Thread.current[:format_locale_key] =
ActionController::HashKey.get(self.class, formats, I18n.locale)
AbstractController::HashKey.get(self.class, formats, I18n.locale)
end
end

View File

@ -0,0 +1,57 @@
require 'abstract_unit'
module AbstractController
module Testing
class CachedController < AbstractController::Base
include AbstractController::RenderingController
include AbstractController::LocalizedCache
self.view_paths = [ActionView::FixtureResolver.new(
"default.erb" => "With Default",
"template.erb" => "With Template",
"some/file.erb" => "With File",
"template_name.erb" => "With Template Name"
)]
end
class TestLocalizedCache < ActiveSupport::TestCase
def setup
@controller = CachedController.new
CachedController.clear_template_caches!
end
def test_templates_are_cached
@controller.render :template => "default.erb"
assert_equal "With Default", @controller.response_body
cached = @controller.class.template_cache
assert_equal 1, cached.size
assert_kind_of ActionView::Template, cached.values.first["default.erb"]
end
def test_cache_is_used
CachedController.new.render :template => "default.erb"
@controller.expects(:find_template).never
@controller.render :template => "default.erb"
assert_equal 1, @controller.class.template_cache.size
end
def test_cache_changes_with_locale
CachedController.new.render :template => "default.erb"
I18n.locale = :es
@controller.render :template => "default.erb"
assert_equal 2, @controller.class.template_cache.size
ensure
I18n.locale = :en
end
end
end
end