aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_view/base.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_view/base.rb')
-rw-r--r--actionpack/lib/action_view/base.rb49
1 files changed, 38 insertions, 11 deletions
diff --git a/actionpack/lib/action_view/base.rb b/actionpack/lib/action_view/base.rb
index 5d52eeaef9..f23cb16245 100644
--- a/actionpack/lib/action_view/base.rb
+++ b/actionpack/lib/action_view/base.rb
@@ -252,6 +252,7 @@ module ActionView #:nodoc:
else
template_extension = pick_template_extension(template_path).to_s
template_file_name = full_template_path(template_path, template_extension)
+ template_extension.gsub!(/^\w+\./, '') # strip off any formats
end
else
template_file_name = template_path
@@ -330,10 +331,11 @@ module ActionView #:nodoc:
end
def pick_template_extension(template_path)#:nodoc:
+ formatted_template_path = "#{template_path}.#{template_format}"
if @@cache_template_extensions
- @@cached_template_extension[template_path] ||= find_template_extension_for(template_path)
+ @@cached_template_extension[formatted_template_path] ||= find_template_extension_for(template_path, formatted_template_path)
else
- find_template_extension_for(template_path)
+ find_template_extension_for(template_path, formatted_template_path)
end
end
@@ -359,15 +361,24 @@ module ActionView #:nodoc:
template_exists?(template_path, :rjs)
end
+ def formatted_template_exists?(formatted_template_exists)
+ [:erb, :builder, :rjs].each do |ext|
+ return ext if template_exists?(formatted_template_exists, ext)
+ end
+ nil
+ end
+
def file_exists?(template_path)#:nodoc:
template_file_name, template_file_extension = path_and_extension(template_path)
if template_file_extension
template_exists?(template_file_name, template_file_extension)
else
- cached_template_extension(template_path) ||
- %w(erb rhtml builder rxml javascript delegate).any? do |template_type|
- send("#{template_type}_template_exists?", template_path)
- end
+ formatted_template_path = "#{template_path}.#{template_format}"
+ cached_template_extension(formatted_template_path) ||
+ formatted_template_exists?(formatted_template_path) ||
+ %w(erb rhtml builder rxml javascript delegate).any? do |template_type|
+ send("#{template_type}_template_exists?", template_path)
+ end
end
end
@@ -376,6 +387,17 @@ module ActionView #:nodoc:
template_path.split('/').last[0,1] != '_'
end
+ def template_format
+ if @template_format != false
+ # check controller.respond_to?(:request) in case its an ActionMailer::Base, or some other sneaky class.
+ @template_format = controller.respond_to?(:request) ? false : :html
+ if controller && controller.respond_to?(:request) && controller.request && controller.request.format
+ @template_format = controller.request.format == Mime::ALL ? :html : controller.request.format.to_sym
+ end
+ end
+ @template_format
+ end
+
private
def full_template_path(template_path, extension)
file_name = "#{template_path}.#{extension}"
@@ -389,13 +411,16 @@ module ActionView #:nodoc:
@@method_names.has_key?(file_path) || FileTest.exists?(file_path)
end
+ # Splits the path and extension from the given template_path and returns as an array.
def path_and_extension(template_path)
template_path_without_extension = template_path.sub(/\.(\w+)$/, '')
[ template_path_without_extension, $1 ]
end
- def cached_template_extension(template_path)
- @@cache_template_extensions && @@cached_template_extension[template_path]
+ # Caches the extension for the given formatted template path. The extension may have the format
+ # too, such as 'html.erb'.
+ def cached_template_extension(formatted_template_path)
+ @@cache_template_extensions && @@cached_template_extension[formatted_template_path]
end
# Returns the view path that contains the given relative template path.
@@ -404,11 +429,13 @@ module ActionView #:nodoc:
end
# Determines the template's file extension, such as rhtml, rxml, or rjs.
- def find_template_extension_for(template_path)
+ def find_template_extension_for(template_path, formatted_template_path = nil)
+ formatted_template_path ||= "#{template_path}.#{template_format}"
if match = delegate_template_exists?(template_path)
match.first.to_sym
- elsif extension = erb_template_exists?(template_path): extension
- elsif extension = builder_template_exists?(template_path): extension
+ elsif extension = formatted_template_exists?(formatted_template_path): "#{template_format}.#{extension}"
+ elsif extension = erb_template_exists?(template_path): extension
+ elsif extension = builder_template_exists?(template_path): extension
elsif javascript_template_exists?(template_path): :rjs
else
raise ActionViewError, "No erb, builder, rhtml, rxml, rjs or delegate template found for #{template_path} in #{@view_paths.inspect}"