aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2010-03-07 19:41:58 +0100
committerJosé Valim <jose.valim@gmail.com>2010-03-07 19:41:58 +0100
commitc7564d74e8a9b451f9fc78566ab0c734671f9612 (patch)
treec903fd5650626a79f53c89ccb1b8e10e1052bae6 /actionpack/lib/action_view
parent6e0443fd433393dc1967fab4f4fa06dc2b3c02fd (diff)
downloadrails-c7564d74e8a9b451f9fc78566ab0c734671f9612.tar.gz
rails-c7564d74e8a9b451f9fc78566ab0c734671f9612.tar.bz2
rails-c7564d74e8a9b451f9fc78566ab0c734671f9612.zip
Added template lookup responsible to hold all information used in template lookup.
Diffstat (limited to 'actionpack/lib/action_view')
-rw-r--r--actionpack/lib/action_view/base.rb78
-rw-r--r--actionpack/lib/action_view/helpers/prototype_helper.rb4
-rw-r--r--actionpack/lib/action_view/paths.rb4
-rw-r--r--actionpack/lib/action_view/render/partials.rb4
-rw-r--r--actionpack/lib/action_view/render/rendering.rb8
-rw-r--r--actionpack/lib/action_view/template.rb1
-rw-r--r--actionpack/lib/action_view/template/lookup.rb48
7 files changed, 82 insertions, 65 deletions
diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb
index 76f9eb2b0d..22bc390dc5 100644
--- a/actionpack/lib/action_view/base.rb
+++ b/actionpack/lib/action_view/base.rb
@@ -180,64 +180,21 @@ module ActionView #:nodoc:
attr_accessor :base_path, :assigns, :template_extension
attr_internal :captures
- def reset_formats(formats)
- old_formats, self.formats = self.formats, formats
- reset_hash_key
- yield if block_given?
- ensure
- if block_given?
- self.formats = old_formats
- reset_hash_key
- end
- end
-
- def reset_hash_key
- 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] =
- AbstractController::HashKey.get(self.class, :formats => formats, :locale => [I18n.locale])
- end
- end
-
- def formats
- controller ? controller.formats : @formats
- end
-
- def formats=(val)
- if controller
- controller.formats = val
- else
- @formats = val
- end
- end
-
class << self
delegate :erb_trim_mode=, :to => 'ActionView::Template::Handlers::ERB'
delegate :logger, :to => 'ActionController::Base', :allow_nil => true
end
- @@debug_rjs = false
- ##
- # :singleton-method:
# Specify whether RJS responses should be wrapped in a try/catch block
# that alert()s the caught exception (and then re-raises it).
cattr_accessor :debug_rjs
-
- # Specify whether templates should be cached. Otherwise the file we be read everytime it is accessed.
- # Automatically reloading templates are not thread safe and should only be used in development mode.
- @@cache_template_loading = nil
- cattr_accessor :cache_template_loading
+ @@debug_rjs = false
# :nodoc:
def self.xss_safe?
true
end
- def self.cache_template_loading?
- ActionController::Base.allow_concurrency || (cache_template_loading.nil? ? !ActiveSupport::Dependencies.load? : cache_template_loading)
- end
-
attr_internal :request, :layout
def controller_path
@@ -249,8 +206,6 @@ module ActionView #:nodoc:
delegate :logger, :to => :controller, :allow_nil => true
- delegate :find, :to => :view_paths
-
include Context
def self.process_view_paths(value)
@@ -287,10 +242,10 @@ module ActionView #:nodoc:
klass = self
end
- klass.new(controller.class.view_paths, {}, controller)
+ klass.new(controller.template_lookup, {}, controller)
end
- def initialize(view_paths = [], assigns_for_first_render = {}, controller = nil, formats = nil)#:nodoc:
+ def initialize(template_lookup = nil, assigns_for_first_render = {}, controller = nil, formats = nil) #:nodoc:
@config = nil
@formats = formats
@assigns = assigns_for_first_render.each { |key, value| instance_variable_set("@#{key}", value) }
@@ -298,16 +253,33 @@ module ActionView #:nodoc:
@_controller = controller
@_config = ActiveSupport::InheritableOptions.new(controller.config) if controller
- @_content_for = Hash.new {|h,k| h[k] = ActiveSupport::SafeBuffer.new }
+ @_content_for = Hash.new { |h,k| h[k] = ActiveSupport::SafeBuffer.new }
@_virtual_path = nil
- self.view_paths = view_paths
+
+ @template_lookup = template_lookup.is_a?(ActionView::Template::Lookup) ?
+ template_lookup : ActionView::Template::Lookup.new(template_lookup)
end
attr_internal :controller, :template, :config
- attr_reader :view_paths
- def view_paths=(paths)
- @view_paths = self.class.process_view_paths(paths)
+ attr_reader :template_lookup
+ delegate :find, :view_paths, :view_paths=, :to => :template_lookup
+
+ def formats=(formats)
+ update_details(:formats => Array(formats))
+ end
+
+ def update_details(details)
+ old_details = template_lookup.details
+ template_lookup.details = old_details.merge(details)
+
+ if block_given?
+ begin
+ yield
+ ensure
+ template_lookup.details = old_details
+ end
+ end
end
def punctuate_body!(part)
diff --git a/actionpack/lib/action_view/helpers/prototype_helper.rb b/actionpack/lib/action_view/helpers/prototype_helper.rb
index 67a7586699..be49b5cc28 100644
--- a/actionpack/lib/action_view/helpers/prototype_helper.rb
+++ b/actionpack/lib/action_view/helpers/prototype_helper.rb
@@ -182,7 +182,7 @@ module ActionView
def initialize(context, &block) #:nodoc:
context._evaluate_assigns_and_ivars
@context, @lines = context, []
- @context.reset_formats([:js, :html]) do
+ @context.update_details(:formats => [:js, :html]) do
include_helpers_from_context
@context.with_output_buffer(@lines) do
@context.instance_exec(self, &block)
@@ -583,7 +583,7 @@ module ActionView
end
def with_formats(*args)
- @context ? @context.reset_formats(args) { yield } : yield
+ @context ? @context.update_details(:formats => args) { yield } : yield
end
def javascript_object_for(object)
diff --git a/actionpack/lib/action_view/paths.rb b/actionpack/lib/action_view/paths.rb
index 459b6bba54..154a79a8f1 100644
--- a/actionpack/lib/action_view/paths.rb
+++ b/actionpack/lib/action_view/paths.rb
@@ -9,7 +9,7 @@ module ActionView #:nodoc:
METHOD
end
- def find(path, details = {}, prefix = nil, partial = false)
+ def find(path, details = {}, prefix = nil, partial = false, key=nil)
each do |resolver|
if template = resolver.find(path, details, prefix, partial)
return template
@@ -19,7 +19,7 @@ module ActionView #:nodoc:
raise ActionView::MissingTemplate.new(self, "#{prefix}/#{path}", details, partial)
end
- def exists?(path, details = {}, prefix = nil, partial = false)
+ def exists?(path, details = {}, prefix = nil, partial = false, key=nil)
each do |resolver|
if resolver.find(path, details, prefix, partial)
return true
diff --git a/actionpack/lib/action_view/render/partials.rb b/actionpack/lib/action_view/render/partials.rb
index 8b6dce0c1c..74513935a7 100644
--- a/actionpack/lib/action_view/render/partials.rb
+++ b/actionpack/lib/action_view/render/partials.rb
@@ -309,7 +309,7 @@ module ActionView
prefix = controller.controller_path unless path.include?(?/)
end
- @view.find(path, {:formats => @view.formats}, prefix, true)
+ @view.find(path, prefix, true)
end
def partial_path(object = @object)
@@ -329,7 +329,7 @@ module ActionView
details = options[:_details]
- # Is this needed
+ # TODO This should happen automatically as well
self.formats = details[:formats] if details
renderer = PartialRenderer.new(self, options, nil)
text = renderer.render
diff --git a/actionpack/lib/action_view/render/rendering.rb b/actionpack/lib/action_view/render/rendering.rb
index 28b79bfcb7..1be5675e37 100644
--- a/actionpack/lib/action_view/render/rendering.rb
+++ b/actionpack/lib/action_view/render/rendering.rb
@@ -25,7 +25,7 @@ module ActionView
end
template = if options[:file]
- find(options[:file], details_for_render)
+ find(options[:file])
elsif options[:inline]
handler = Template.handler_class_for_extension(options[:type] || "erb")
Template.new(options[:inline], "inline template", handler, {})
@@ -34,7 +34,7 @@ module ActionView
end
if template
- layout = find(layout, details_for_render) if layout
+ layout = find(layout) if layout
_render_template(template, layout, :locals => options[:locals])
end
when :update
@@ -44,10 +44,6 @@ module ActionView
end
end
- def details_for_render
- controller.try(:details_for_render) || {:formats => formats}
- end
-
# You can think of a layout as a method that is called with a block. _layout_for
# returns the contents that are yielded to the layout. If the user calls yield
# :some_name, the block, by default, returns content_for(:some_name). If the user
diff --git a/actionpack/lib/action_view/template.rb b/actionpack/lib/action_view/template.rb
index cd6b1930a1..c176359253 100644
--- a/actionpack/lib/action_view/template.rb
+++ b/actionpack/lib/action_view/template.rb
@@ -13,6 +13,7 @@ module ActionView
autoload :Handler
autoload :Handlers
autoload :Text
+ autoload :Lookup
end
extend Template::Handlers
diff --git a/actionpack/lib/action_view/template/lookup.rb b/actionpack/lib/action_view/template/lookup.rb
new file mode 100644
index 0000000000..ea3a12615b
--- /dev/null
+++ b/actionpack/lib/action_view/template/lookup.rb
@@ -0,0 +1,48 @@
+module ActionView
+ class Template
+ class Lookup
+ attr_reader :details, :view_paths
+
+ class DetailsKey
+ attr_reader :details
+ alias :eql? :equal?
+
+ @details_keys = Hash.new
+
+ def self.get(details)
+ @details_keys[details] ||= new(details)
+ end
+
+ def initialize(details)
+ @details, @hash = details, details.hash
+ end
+ end
+
+ def initialize(view_paths, details = {})
+ @details = details
+ self.view_paths = view_paths
+ end
+
+ def view_paths=(paths)
+ @view_paths = ActionView::Base.process_view_paths(paths)
+ end
+
+ def details=(details)
+ @details = details
+ @details_key = nil if @details_key && @details_key.details != details
+ end
+
+ def details_key
+ @details_key ||= DetailsKey.get(details) unless details.empty?
+ end
+
+ def find(name, prefix = nil, partial = false)
+ @view_paths.find(name, details, prefix, partial || false, details_key)
+ end
+
+ def exists?(name, prefix = nil, partial = false)
+ @view_paths.exists?(name, details, prefix, partial || false, details_key)
+ end
+ end
+ end
+end \ No newline at end of file