概要
MITライセンスに基づいて翻訳・公開いたします。
- 英語記事: ActionDispatch::Routing::Redirection
- 原文更新日: 2017/10/21
- サイト: Ruby on Rails API
- ライセンス: MIT
Rails API: ActionDispatch::Routing::Redirection#redirect(翻訳)
任意のパスを別のパスにリダイレクトします。
get "/stories" => redirect("/posts")
上のコードはユーザーをリダイレクトしますが、リクエストの他の部分(/stories
や/stories?foo=bar
といったクエリ文字列など)は無視して、すべて/posts
にリダイレクトします。
与えられるリダイレクトの引数内で、以下のように式展開を使うこともできます。
get 'docs/:article', to: redirect('/wiki/%{article}')
URLの冒頭にスラッシュ/
がないパスを返すと、現在のSCRIPT_NAME
環境変数がプレフィックスとして冒頭に追加されます。この変数の値は/
の場合が典型的ですが、マウントしたエンジンや、アプリケーションがWebサイトのサブディレクトリにデプロイされている場合にはこのとおりでないこともあります。
この他にもいくつかの構文を使うことができます。
リダイレクトをブロックで表現すると、そのリダイレクトに関連する任意のロジックを簡単にカプセル化できます。引数には、ブロックで受け取る引数の個数に応じて、paramsとリクエスト、またはparamsのみのいずれかが使えます。戻り値として文字列が1つ必要です。
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}"
}
ただし、do end
構文はリダイレクトブロックでは使えません。理由は、Rubyはこのブロックをredirect
ではなくget
に渡すからです。{ }
ブロックをお使いください。
オプションとしてのredirect
では、変更の必要なURLの一部のみを渡せます。このオプションでは、上述の最初の例のような式展開もサポートされています。
get 'stores/:name', to: redirect(subdomain: 'stores', path: '/%{name}')
get 'stores/:name(*all)', to: redirect(subdomain: 'stores', path: '/%{name}%{all}')
get '/stories', to: redirect(path: '/posts')
上はユーザーをリダイレクトしますが、リクエストの特定の部分のみを変更します。たとえば、上の末尾の例のpath:
オプションでは、/stories
は/posts
に、/stories?foo=bar
は/posts?foo=bar
にそれぞれリダイレクトされます。
最後に、呼び出しに応答するオブジェクトを渡してリダイレクトすることができます。これを用いて、共通のリダイレクトルーティングを再利用できます。この呼出メソッドは、paramsとリクエストという2つの引数を取らなければならず、文字列を1つ返さなければなりません。
get 'accounts/:name' => redirect(SubdomainRedirector.new('api'))