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] ‘form_with’ APIドキュメント完全翻訳

デザインも頼めるシステム開発会社をお探しならBPS株式会社までどうぞ 開発エンジニア積極採用中です! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

hachi8833

Twitter: @hachi8833、GitHub: @hachi8833 コボラー、ITコンサル、ローカライズ業界、Rails開発を経てTechRachoの編集・記事作成を担当。 これまでにRuby on Rails チュートリアル第2版の監修および半分程度を翻訳、Railsガイドの初期翻訳ではほぼすべてを翻訳。その後も折に触れて更新翻訳中。 かと思うと、正規表現の粋を尽くした日本語エラーチェックサービス enno.jpを運営。 実は最近Go言語が好きで、Goで書かれたRubyライクなGoby言語のメンテナーでもある。 仕事に関係ないすっとこブログ「あけてくれ」は2000年頃から多少の中断をはさんで継続、現在はnote.muに移転。

hachi8833の書いた記事

BPSアドベントカレンダー

週刊Railsウォッチ