提交 c7760809 编写于 作者: J José Valim

Allow cache to be temporarily disabled through lookup_context.

上级 c563f10f
......@@ -61,6 +61,7 @@ def initialize
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 @@ def handlers_regexp #:nodoc:
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 @@ def refresh(view)
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 @@ def initialize(hash = {})
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 @@ class WithoutLayoutController < ActionController::Base
"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 @@ def builder_template
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 @@ class TestWithoutLayout < Rack::TestCase
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 @@ def teardown
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
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册