Extracted localized_cache.rb from ActionController, added it to AbstractController and made ActionMailer use it.
This commit is contained in:
parent
a107103e85
commit
976c264724
|
@ -254,6 +254,7 @@ module ActionMailer #:nodoc:
|
|||
include AdvAttrAccessor, PartContainer, Quoting, Utils
|
||||
|
||||
include AbstractController::RenderingController
|
||||
include AbstractController::LocalizedCache
|
||||
include AbstractController::Layouts
|
||||
|
||||
include AbstractController::Helpers
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue