Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Railsのconfig/route.rbで別サイトにリダイレクトさせる際の注意点

More than 5 years have passed since last update.

Railsのroute設定では別URLへのリダイレクトを記述できるが、ちょっとしたpitfallがあるので書いておく

リダイレクト記述は下記のようになる

routes.rb
 get "foo/:id" => redirect("http://othersite.com/foo/%{id}",:status => 301 )

ここで問題はこの記述を書く位置である。若干Railsのバグっぽい挙動があり、例えばlink_toなどのハッシュ型のリンク記述でidがあると上記とマッチしてしまうという現象がある。

つまり

<%= button_to "POST",:controller => "bar",:action => "foo",:id => 12  %>

のようなリンクがある場合、下記のようにリダイレクトのものが先にくると、困ったことにそれにマッチしていると認識されるようである

route.rb
get "foo/:id" => redirect("http://othersite.com/foo/%{id}",:status => 301)
post "foo/:id" => "foo#bar"

結果としては意図しない外部サイトへのリダイレクトに遭遇することとなる。

よって外部サイトのredirectはroute.rbの最後に書くのが安全そうである。

ちなみにroutingのテストはfunctionalsテストとして下記のように書ける

foo_controller_test.rb
assert_routing "/foo/123",{:controller =>"bar",:action =>"foo",:id => "123"}
assert_routing {:method => :post,:path => "/foo"},{:controller => "bar",:action => "foo"}

現時点ではredirectを持つroutingのテスト方法は不明(stack overflowで質問中)だが、それ以外だけでも丁寧に書いておけば妙なハマりを未然に防げるだろう。

sawamur@github
Software Engineer / Interaction Desginer
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away