2023-01-26 Rails redirect in routing
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]}" }
なお 第二引数となっている req
は ActionDispatch::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}"
}