
リダイレクトって何?

Rails でリダイレクトする方法を教えて下さい。
そんな疑問にお答えします。
リダイレクトとは
リダイレクトは HTTP レスポンスの一種です。
HTTP レスポンスは通常は HTML などのコンテンツを返します。

代わりに「次にアクセスしてほしいURL」を返すのがリダイレクトです。

リダイレクトのレスポンス(URL)を受け取った場合、ブラウザは自動的にそのURLに GET でリクエストしなおします。

Webアプリケーションでリダイレクトを利用する場面
Webアプリケーションでは多くの場合、
- データの作成
- データの更新
- データの削除
のように、ページを表示すること以外の目的のリクエストに対してリダイレクトを使います。
例えば、「データを作成したら、その作られたデータの詳細ページにリダイレクトする」といった方法をとります。
「メッセージ」というデータを作成する場合は、POST /messages をリクエストして詳細ページのURL /messages/番号 を返し、

受け取ったURLへ再度リクエストし直すことで詳細ページにたどり着きます。

以上のように、
- サーバはリクエストしたときに別のURLを返す
- ブラウザは受け取ったURLへリクエストしなおす
というのがリダイレクトの仕組みです。
redirect_to
redirect_to メソッドは Ruby on Rails で HTTP レスポンスとしてリダイレクトを発生させるメソッドです。
つまり、URLを返すHTTPレスポンスを作るメソッドと考えると良いでしょう。
redirect_to メソッドの使い方について解説していきます。
基本
redirect_to はコントローラのメソッド(アクション)で呼び出すメソッドです。
引数に URL を表す文字列を取ります。
redirect_to "URL文字列"
例えば、
redirect_to "https://google.com"
とすると、Googleのトップページにリダイレクトします。
_urlヘルパーを使う
Ruby on Rails では、ルーティングで作成される Prefix + _url のメソッドを使うのが一般的です。
例えば以下のようなルーティングが設定されているとします。
Prefix Verb URI Pattern Controller#Action
post GET /posts/:id(.:format) posts#show
Prefix に post が設定されているので、PostsController の show アクションへの URL は post_url メソッドで取得することができます。
そのため、
redirect_to post_url(1)
とすると、https://〜〜/posts/1 にリダイレクトすることができ、詳細ページを表示することができます。
ルーティングの読み方については以下を参照してください。
≫ 参考: rails routes コマンドの読み方を徹底解説
モデルのインスタンスを引数にする
通常 redirect_to の引数は URL を表す文字列ですが、モデルのインスタンスを渡すこともできます。
モデルのインスタンスを渡した場合は、そのモデルの詳細ページを表示する、というルールがあります。
例えば、前の例と同様、以下のルーティングが設定されているとします。
Prefix Verb URI Pattern Controller#Action
post GET /posts/:id(.:format) posts#show
これは
resouces :posts
で設定されたルーティングです。
このとき、
redirect_to Post.find(1)
のように Post モデルのインスタンスを渡してあげると https://〜〜/posts/1 にアクセスし、詳細ページを表示することになります。
コントローラ+アクションを指定する
ルーティングに
Prefix Verb URI Pattern Controller#Action
post GET /posts/:id(.:format) posts#show
のように Prefix が設定されていれば Prefix + _url のメソッドを通じてURLを作ることができますが、
Prefix Verb URI Pattern Controller#Action
GET /posts/:id(.:format) posts#show
のように Prefix が無いルーティングの場合はどうするのでしょうか。
この場合はコントローラ名とアクション名を直接指定することで対応できます。
この例の場合は Controller#Action が posts#show なので
redirect_to controller: :posts, action: :show, id: 1
とすることで https://〜〜/posts/1 にリダイレクトされます。
id: 1 があるのは URL Pattern に :id というパラメータがあるためです。
まとめ
Ruby on Rails でリダイレクトを実現する方法について解説しました。
まとめると以下のようになります。
- リダイレクトとは別のURLに(GETで)アクセスし直してもらうためのHTTPレスポンスの一種
- redirect_to メソッドに「URL文字列」もしくは「モデルのインスタンス」を渡すことでリダイレクトが実現できる
データの作成、更新、削除といった、ページの表示以外の目的のリクエストでは必須のテクニックですので redirect_to を使いこなせるようになりましょう!