Railsのルーティングで redirect するときの書き方をメモ。

すべてをリダイレクト

get "/stories" => redirect("/posts")

上記の場合、クエリパラメータが付いていようどうだろうが /posts へとリダイレクトを行う。

リダイレクト時のステータスコード指定

get "/stories" => redirect("/posts", status: 307)

デフォルトだと 301 redirect になるが、上記のようにステータスコードを指定可能。

パラメータを受けてリダレクト

get 'docs/:article', to: redirect('/wiki/%{article}')

:article に指定された部分を受けて、それを引き継いだ上で別のパスへとリダイレクト。

パスのみリダイレクト

get '/stories', to: redirect(path: '/posts')

パスのみ変換。上記の場合、クエリパラメータを引き継ぐことができる。

サブドメインへのリダイレクト

get 'stores/:name', to: redirect(subdomain: 'stores', path: '/%{name}')

パス指定をサブドメインに変換してくれる書き方。

クエリパラメータを変換してリダイレクト

get '/stories', to: redirect { |_, req| "posts?after=#{req.params[:before]}" }

なお 第二引数となっている reqActionDispatch::Request クラスである。一方、第一引数はHashとなる。

redirectがブロックを受け取る例として、ドキュメントでは下記のredirect例が掲載されている。

get 'jokes/:number', to: redirect { |params, request|
  path = (params[:number].to_i.even? ? "wheres-the-beef" : "i-love-lamp")
  "http://#{request.host_with_port}/#{path}"
}

参考