From da6f5a1cb4ccabef8c5ae0cb56495c198844c4f8 Mon Sep 17 00:00:00 2001 From: Rick Olson Date: Mon, 2 Apr 2007 00:02:11 +0000 Subject: Change ActionView template defaults. Look for templates using the request format first, such as show.html.erb or show.xml.builder, before looking for the old defaults like show.erb or show.builder [Rick] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6499 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/lib/action_view/base.rb | 49 +++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 11 deletions(-) (limited to 'actionpack/lib/action_view') 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}" -- cgit v1.2.3