From ff063d700d2fda2076217ab0479e8602253ab49c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20L=C3=BCtke?= Date: Wed, 30 Aug 2006 00:34:36 +0000 Subject: [PATCH] respond_to .html now always renders #{action_name}.rhtml so that registered custom template handlers do not override it in priority. Custom mime types require a block and throw proper error now. git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@4860 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_controller/base.rb | 2 ++ .../lib/action_controller/mime_responds.rb | 14 ++++++++------ actionpack/lib/action_controller/mime_type.rb | 2 +- .../test/controller/mime_responds_test.rb | 19 +++++++++++++++++++ 5 files changed, 32 insertions(+), 7 deletions(-) diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 96bafacdcb..917be84b3b 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* respond_to .html now always renders #{action_name}.rhtml so that registered custom template handlers do not override it in priority. Custom mime types require a block and throw proper error now. [Tobias Luetke] + * Deprecation: test deprecated instance vars in partials. [Jeremy Kemper] * Add UrlWriter to allow writing urls from Mailers and scripts. [Nicholas Seckar] diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 2c91266f6f..1ceb58711b 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -27,6 +27,8 @@ class UnknownAction < ActionControllerError #:nodoc: end class MissingFile < ActionControllerError #:nodoc: end + class RenderError < ActionControllerError #:nodoc: + end class SessionOverflowError < ActionControllerError #:nodoc: DEFAULT_MESSAGE = 'Your session data is larger than the data column in which it is to be stored. You must increase the size of your data column if you intend to store large data.' diff --git a/actionpack/lib/action_controller/mime_responds.rb b/actionpack/lib/action_controller/mime_responds.rb index fd9af05905..21905b26c8 100644 --- a/actionpack/lib/action_controller/mime_responds.rb +++ b/actionpack/lib/action_controller/mime_responds.rb @@ -108,11 +108,9 @@ def respond_to(*types, &block) end class Responder #:nodoc: - DEFAULT_BLOCKS = { - :html => 'Proc.new { render }', - :js => 'Proc.new { render :action => "#{action_name}.rjs" }', - :xml => 'Proc.new { render :action => "#{action_name}.rxml" }' - } + DEFAULT_BLOCKS = [:html, :js, :xml].inject({}) do |blocks, ext| + blocks.update ext => %(Proc.new { render :action => "\#{action_name}.r#{ext}" }) + end def initialize(block_binding) @block_binding = block_binding @@ -134,7 +132,11 @@ def custom(mime_type, &block) if block_given? @responses[mime_type] = block else - @responses[mime_type] = eval(DEFAULT_BLOCKS[mime_type.to_sym], @block_binding) + if source = DEFAULT_BLOCKS[mime_type.to_sym] + @responses[mime_type] = eval(source, @block_binding) + else + raise ActionController::RenderError, "Expected a block but none was given for custom mime handler #{mime_type}" + end end end diff --git a/actionpack/lib/action_controller/mime_type.rb b/actionpack/lib/action_controller/mime_type.rb index dccc32bb91..f2b8e32546 100644 --- a/actionpack/lib/action_controller/mime_type.rb +++ b/actionpack/lib/action_controller/mime_type.rb @@ -34,7 +34,7 @@ def lookup(string) def register(string, symbol, synonyms = []) Mime.send :const_set, symbol.to_s.upcase, Type.new(string, symbol, synonyms) SET << Mime.send(:const_get, symbol.to_s.upcase) - LOOKUP[string] = EXTENSION_LOOKUP[symbol.to_s] = SET.last + LOOKUP[string] = EXTENSION_LOOKUP[symbol.to_s] = SET.last end def parse(accept_header) diff --git a/actionpack/test/controller/mime_responds_test.rb b/actionpack/test/controller/mime_responds_test.rb index d18d4679d4..9118d9e553 100644 --- a/actionpack/test/controller/mime_responds_test.rb +++ b/actionpack/test/controller/mime_responds_test.rb @@ -72,6 +72,18 @@ def custom_constant_handling Mime.send :remove_const, :MOBILE end + + def custom_constant_handling_without_block + Mime::Type.register("text/x-mobile", :mobile) + + respond_to do |type| + type.html { render :text => "HTML" } + type.mobile + end + + Mime.send :remove_const, :MOBILE + end + def handle_any respond_to do |type| @@ -271,6 +283,13 @@ def test_custom_constant assert_equal "Mobile", @response.body end + def custom_constant_handling_without_block + + assert_raised(ActionController::RenderError) do + get :custom_constant_handling, :format => "mobile" + end + end + def test_forced_format get :html_xml_or_rss assert_equal "HTML", @response.body -- GitLab