mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Allow cache to be temporarily disabled through lookup_context.
This commit is contained in:
parent
c563f10f3e
commit
c7760809bf
5 changed files with 53 additions and 6 deletions
|
@ -61,6 +61,7 @@ module ActionView
|
|||
def initialize(view_paths, details = {})
|
||||
@details, @details_key = { :handlers => default_handlers }, nil
|
||||
@frozen_formats, @skip_default_locale = false, false
|
||||
@cache = details.key?(:cache) ? details.delete(:cache) : true
|
||||
|
||||
self.view_paths = view_paths
|
||||
self.registered_detail_setters.each do |key, setter|
|
||||
|
@ -130,10 +131,20 @@ module ActionView
|
|||
end
|
||||
|
||||
module Details
|
||||
attr_accessor :cache
|
||||
|
||||
# Calculate the details key. Remove the handlers from calculation to improve performance
|
||||
# since the user cannot modify it explicitly.
|
||||
def details_key #:nodoc:
|
||||
@details_key ||= DetailsKey.get(@details)
|
||||
@details_key ||= DetailsKey.get(@details) if @cache
|
||||
end
|
||||
|
||||
# Temporary skip passing the details_key forward.
|
||||
def disable_cache
|
||||
old_value, @cache = @cache, false
|
||||
yield
|
||||
ensure
|
||||
@cache = old_value
|
||||
end
|
||||
|
||||
# Freeze the current formats in the lookup context. By freezing them, you are guaranteeing
|
||||
|
|
|
@ -286,7 +286,9 @@ module ActionView
|
|||
pieces = @virtual_path.split("/")
|
||||
name = pieces.pop
|
||||
partial = name.sub!(/^_/, "")
|
||||
view.find_template(name, pieces.join, partial || false, ["unlikely_local_key"])
|
||||
view.lookup_context.disable_cache do
|
||||
view.find_template(name, pieces.join, partial || false, @locals)
|
||||
end
|
||||
end
|
||||
|
||||
def method_name
|
||||
|
|
|
@ -16,16 +16,18 @@ module ActionView #:nodoc:
|
|||
private
|
||||
|
||||
def query(path, exts, formats)
|
||||
query = Regexp.escape(path)
|
||||
query = ""
|
||||
exts.each do |ext|
|
||||
query << '(' << ext.map {|e| e && Regexp.escape(".#{e}") }.join('|') << '|)'
|
||||
end
|
||||
query = /^(#{Regexp.escape(path)})#{query}$/
|
||||
|
||||
templates = []
|
||||
@hash.select { |k,v| k =~ /^#{query}$/ }.each do |_path, source|
|
||||
@hash.each do |_path, source|
|
||||
next unless _path =~ query
|
||||
handler, format = extract_handler_and_format(_path, formats)
|
||||
templates << Template.new(source, _path, handler,
|
||||
:virtual_path => _path, :format => format)
|
||||
:virtual_path => $1, :format => format)
|
||||
end
|
||||
|
||||
templates.sort_by {|t| -t.identifier.match(/^#{query}$/).captures.reject(&:blank?).size }
|
||||
|
|
|
@ -11,7 +11,8 @@ module RenderTemplate
|
|||
"with_raw.html.erb" => "Hello <%=raw '<strong>this is raw</strong>' %>",
|
||||
"test/with_json.html.erb" => "<%= render :template => 'test/with_json.json' %>",
|
||||
"test/with_json.json.erb" => "<%= render :template => 'test/final' %>",
|
||||
"test/final.json.erb" => "{ final: json }"
|
||||
"test/final.json.erb" => "{ final: json }",
|
||||
"test/with_error.html.erb" => "<%= idontexist %>"
|
||||
)]
|
||||
|
||||
def index
|
||||
|
@ -49,6 +50,10 @@ module RenderTemplate
|
|||
def with_raw
|
||||
render :template => "with_raw"
|
||||
end
|
||||
|
||||
def with_error
|
||||
render :template => "test/with_error"
|
||||
end
|
||||
end
|
||||
|
||||
class TestWithoutLayout < Rack::TestCase
|
||||
|
@ -101,6 +106,12 @@ module RenderTemplate
|
|||
assert_content_type "text/html; charset=utf-8"
|
||||
assert_response "{ final: json }"
|
||||
end
|
||||
|
||||
test "rendering a template with error properly exceprts the code" do
|
||||
get :with_error
|
||||
assert_status 500
|
||||
assert_match "undefined local variable or method `idontexist'", response.body
|
||||
end
|
||||
end
|
||||
|
||||
class WithLayoutController < ::ApplicationController
|
||||
|
|
|
@ -163,4 +163,25 @@ class LookupContextTest < ActiveSupport::TestCase
|
|||
template = @lookup_context.find("foo", "test", true)
|
||||
assert_equal "Bar", template.source
|
||||
end
|
||||
|
||||
test "can disable the cache on demand" do
|
||||
@lookup_context.view_paths = ActionView::FixtureResolver.new("test/_foo.erb" => "Foo")
|
||||
old_template = @lookup_context.find("foo", "test", true)
|
||||
|
||||
template = @lookup_context.find("foo", "test", true)
|
||||
assert_equal template, old_template
|
||||
|
||||
assert @lookup_context.cache
|
||||
template = @lookup_context.disable_cache do
|
||||
assert !@lookup_context.cache
|
||||
@lookup_context.find("foo", "test", true)
|
||||
end
|
||||
assert @lookup_context.cache
|
||||
|
||||
assert_not_equal template, old_template
|
||||
end
|
||||
|
||||
test "can have cache disabled on initialization" do
|
||||
assert !ActionView::LookupContext.new(FIXTURE_LOAD_PATH, :cache => false).cache
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue