1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

All router redirect helper to accept a full URI [#3653 state:resolved]

This commit is contained in:
Joshua Peek 2010-01-05 12:00:38 -06:00
parent 8ff4faf66a
commit b3900a29eb
2 changed files with 24 additions and 6 deletions

View file

@ -200,13 +200,21 @@ module ActionDispatch
path = args.shift || block
path_proc = path.is_a?(Proc) ? path : proc { |params| path % params }
status = options[:status] || 301
body = 'Moved Permanently'
lambda do |env|
req = Rack::Request.new(env)
params = path_proc.call(env["action_dispatch.request.path_parameters"])
url = req.scheme + '://' + req.host + params
req = Request.new(env)
[ status, {'Location' => url, 'Content-Type' => 'text/html'}, ['Moved Permanently'] ]
uri = URI.parse(path_proc.call(req.params))
uri.scheme ||= req.scheme
uri.host ||= req.host
headers = {
'Location' => uri.to_s,
'Content-Type' => 'text/html',
'Content-Length' => body.length.to_s
}
[ status, headers, [body] ]
end
end

View file

@ -29,6 +29,7 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
match 'account/modulo/:name', :to => redirect("/%{name}s")
match 'account/proc/:name', :to => redirect {|params| "/#{params[:name].pluralize}" }
match 'account/google' => redirect('http://www.google.com/')
match 'openid/login', :via => [:get, :post], :to => "openid#login"
@ -472,7 +473,7 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
assert_equal 'projects#index', @response.body
end
end
def test_index
with_test_routes do
assert_equal '/info', info_path
@ -488,7 +489,7 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
assert_equal 'projects#info', @response.body
end
end
def test_convention_match_with_no_scope
with_test_routes do
assert_equal '/account/overview', account_overview_path
@ -497,6 +498,15 @@ class TestRoutingMapper < ActionDispatch::IntegrationTest
end
end
def test_redirect_with_complete_url
with_test_routes do
get '/account/google'
assert_equal 301, @response.status
assert_equal 'http://www.google.com/', @response.headers['Location']
assert_equal 'Moved Permanently', @response.body
end
end
private
def with_test_routes
real_routes, temp_routes = ActionController::Routing::Routes, Routes