From ea30f7353be3a977c5ea50d8efaa02acf26dd133 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Sun, 22 Jan 2006 01:52:23 +0000 Subject: Raise a RedirectBackError if redirect_to :back is called when theres no HTTP_REFERER defined (closes #3049) [kevin.clark@gmail.com] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3459 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- actionpack/CHANGELOG | 2 ++ actionpack/lib/action_controller/base.rb | 9 ++++++++- actionpack/test/controller/redirect_test.rb | 9 +++++++++ actionpack/test/template/url_helper_test.rb | 4 ++-- 4 files changed, 21 insertions(+), 3 deletions(-) (limited to 'actionpack') diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 633d33a52e..a99aac02a2 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Raise a RedirectBackError if redirect_to :back is called when there's no HTTP_REFERER defined #3049 [kevin.clark@gmail.com] + * Treat timestamps like datetimes for scaffolding purposes #3388 [Maik Schmidt] * Fix IE bug with link_to "something", :post => true #3443 [Justin Palmer] diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 8a34cd18cf..0a9368f684 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -40,6 +40,13 @@ module ActionController #:nodoc: super(message || DEFAULT_MESSAGE) end end + class RedirectBackError < ActionControllerError #:nodoc: + DEFAULT_MESSAGE = 'No HTTP_REFERER was set in the request to this action, so redirect_to :back could not be called successfully. If this is a test, make sure to specify @request.env["HTTP_REFERER"].' + + def initialize(message = nil) + super(message || DEFAULT_MESSAGE) + end + end # Action Controllers are made up of one or more actions that performs its purpose and then either renders a template or # redirects to another action. An action is defined as a public method on the controller, which will automatically be @@ -780,7 +787,7 @@ module ActionController #:nodoc: redirect_to(request.protocol + request.host_with_port + options) when :back - redirect_to(request.env["HTTP_REFERER"]) + request.env["HTTP_REFERER"] ? redirect_to(request.env["HTTP_REFERER"]) : raise(RedirectBackError) else if parameters_for_method_reference.empty? diff --git a/actionpack/test/controller/redirect_test.rb b/actionpack/test/controller/redirect_test.rb index 4bad5e26ca..11b32d356b 100755 --- a/actionpack/test/controller/redirect_test.rb +++ b/actionpack/test/controller/redirect_test.rb @@ -27,6 +27,8 @@ class RedirectController < ActionController::Base end def rescue_errors(e) raise e end + + def rescue_action(e) raise end protected def dashbord_url(id, message) @@ -76,6 +78,13 @@ class RedirectTest < Test::Unit::TestCase get :redirect_to_back assert_redirect_url "http://www.example.com/coming/from" end + + def test_redirect_to_back_with_no_referer + assert_raises(ActionController::RedirectBackError) { + @request.env["HTTP_REFERER"] = nil + get :redirect_to_back + } + end end module ModuleTest diff --git a/actionpack/test/template/url_helper_test.rb b/actionpack/test/template/url_helper_test.rb index 78ad185542..3c830341f0 100644 --- a/actionpack/test/template/url_helper_test.rb +++ b/actionpack/test/template/url_helper_test.rb @@ -110,14 +110,14 @@ class UrlHelperTest < Test::Unit::TestCase def test_link_tag_using_post_javascript assert_dom_equal( - "Hello", + "Hello", link_to("Hello", "http://www.example.com", :post => true) ) end def test_link_tag_using_post_javascript_and_confirm assert_dom_equal( - "Hello", + "Hello", link_to("Hello", "http://www.example.com", :post => true, :confirm => "Are you serious?") ) end -- cgit v1.2.3