Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails API: ActionDispatch::Routing::Redirection#redirect(翻訳)

概要

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'))

関連記事

Rails 5.1〜7.0: ‘form_with’ APIドキュメント(翻訳)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。