Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #8297: redirect_status_support.diff

File redirect_status_support.diff, 5.2 kB (added by codahale, 2 years ago)

redirect_to support for the :status option

  • test/controller/redirect_test.rb

    old new  
    2121  def redirect_to_back 
    2222    redirect_to :back 
    2323  end 
     24   
     25  def redirect_with_status 
     26    redirect_to({:action => "hello_world"}, {:status => 301}) 
     27  end 
     28   
     29  def url_redirect_with_status 
     30    redirect_to("http://www.example.com", {:status => 301}) 
     31  end 
     32   
     33  def relative_url_redirect_with_status 
     34    redirect_to("/things/stuff", {:status => :moved_permanently}) 
     35  end 
     36   
     37  def redirect_to_back_with_status 
     38    redirect_to :back, :status => :temporary_redirect 
     39  end 
    2440 
    2541  def rescue_errors(e) raise e end 
    2642     
     
    97113      get :redirect_to_back 
    98114    } 
    99115  end 
     116   
     117  def test_redirect_with_status 
     118    get :redirect_with_status 
     119    assert_response 301 
     120    assert_equal "http://test.host/redirect/hello_world", redirect_to_url 
     121  end 
     122   
     123  def test_url_redirect_with_status 
     124    get :url_redirect_with_status 
     125    assert_response 301 
     126    assert_equal "http://www.example.com", redirect_to_url 
     127  end 
     128   
     129  def test_relative_url_redirect_with_status 
     130    get :relative_url_redirect_with_status 
     131    assert_response 301 
     132    assert_equal "http://test.host/things/stuff", redirect_to_url 
     133  end 
     134   
     135  def test_redirect_to_back_with_status 
     136    @request.env["HTTP_REFERER"] = "http://www.example.com/coming/from" 
     137    get :redirect_to_back_with_status 
     138    assert_response 307 
     139    assert_equal "http://www.example.com/coming/from", redirect_to_url 
     140  end 
    100141end 
    101142 
    102143module ModuleTest 
  • lib/action_controller/base.rb

    old new  
    11require 'action_controller/mime_type' 
    22require 'action_controller/request' 
     3require 'action_controller/status_codes' 
    34require 'action_controller/response' 
    45require 'action_controller/routing' 
    56require 'action_controller/resources' 
    67require 'action_controller/url_rewriter' 
    7 require 'action_controller/status_codes' 
    88require 'drb' 
    99require 'set' 
    1010 
     
    10101010      #   redirect_to "/images/screenshot.jpg" 
    10111011      #   redirect_to :back 
    10121012      # 
    1013       # The redirection happens as a "302 Moved" header. 
     1013      # The redirection happens as a "302 Moved" header. To specify a different type of redirection, use the <tt>:status</tt> 
     1014      # option: 
     1015      #  
     1016      #   redirect_to "http://www.rubyonrails.org", :status => 301 
    10141017      # 
    10151018      # When using <tt>redirect_to :back</tt>, if there is no referrer, 
    10161019      # RedirectBackError will be raised. You may specify some fallback 
     
    10201023          when %r{^\w+://.*} 
    10211024            raise DoubleRenderError if performed? 
    10221025            logger.info("Redirected to #{options}") if logger 
    1023             response.redirect(options) 
     1026            status = parameters_for_method_reference.first.is_a?(Hash) ? parameters_for_method_reference.first[:status] : nil 
     1027            response.redirect(options, status) 
    10241028            response.redirected_to = options 
    10251029            @performed_redirect = true 
    10261030 
    10271031          when String 
    1028             redirect_to(request.protocol + request.host_with_port + options
     1032            redirect_to(request.protocol + request.host_with_port + options, *parameters_for_method_reference
    10291033 
    10301034          when :back 
    1031             request.env["HTTP_REFERER"] ? redirect_to(request.env["HTTP_REFERER"]) : raise(RedirectBackError) 
     1035            request.env["HTTP_REFERER"] ? redirect_to(request.env["HTTP_REFERER"], *parameters_for_method_reference) : raise(RedirectBackError) 
    10321036 
    10331037          else 
    1034             if parameters_for_method_reference.empty? 
    1035               redirect_to(url_for(options)
     1038            if parameters_for_method_reference.empty? || (parameters_for_method_reference.first.is_a?(Hash) && parameters_for_method_reference.first[:status]) 
     1039              redirect_to(url_for(options), *parameters_for_method_reference
    10361040              response.redirected_to = options 
    10371041            else 
    10381042              # TOOD: Deprecate me! 
  • lib/action_controller/response.rb

    old new  
    22 
    33module ActionController 
    44  class AbstractResponse #:nodoc: 
     5    include StatusCodes 
    56    DEFAULT_HEADERS = { "Cache-Control" => "no-cache" } 
     7    DEFAULT_REDIRECT_STATUS_CODE = 302 # Found 
    68    attr_accessor :request 
    79    attr_accessor :body, :headers, :session, :cookies, :assigns, :template, :redirected_to, :redirected_to_method_params, :layout 
    810 
     
    2830      charset.blank? ? nil : charset.strip.split("=")[1] 
    2931    end 
    3032 
    31     def redirect(to_url, permanently = false
    32       self.headers["Status"]   = "302 Found" unless headers["Status"] == "301 Moved Permanently" 
     33    def redirect(to_url, status = nil
     34      self.headers["Status"] = interpret_status(status || DEFAULT_REDIRECT_STATUS_CODE) unless headers["Status"] == "301 Moved Permanently" 
    3335      self.headers["Location"] = to_url 
    3436 
    3537      self.body = "<html><body>You are being <a href=\"#{to_url}\">redirected</a>.</body></html>"