1
0
Fork 0
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:
José Valim 2010-10-07 21:30:19 +02:00
parent c563f10f3e
commit c7760809bf
5 changed files with 53 additions and 6 deletions

View file

@ -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

View file

@ -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

View file

@ -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 }

View file

@ -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

View file

@ -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