更新日:
【Rails】 redirect_toの使い方を理解して指定したURLに遷移させよう
redirect_toとは、redirect_toは指定したURLに遷移させることができるメソッドです。
1
redirect_to "リダイレクト先"
リダイレクト先はURLの他にも指定することができます。
railsではパスが送られるとルーティングで決められたコントローラーのアクションが実行されます。redirect_to
メソッドを使うと、決められたコントローラーのアクション以外のアクションなどを実行させ、選択したビューファイルを表示させることができます。
redirect_toメソッドの使い方
この章では、redirect_toメソッドの使い方について解説します。
リダイレクト先の指定方法
redirect_to
ではリダイレクト先をいろいろな方法で指定できます。
どのような指定方法があるのか確認していきましょう。
URLで指定
指定したURLにリダイレクトさせます。
1
2
3
4
redirect_to "URL"
# Pikawakaのトップページへリダイレクト
redirect_to "http://www.pikawaka.com"
Prefixで指定
Prefixで指定したアクションにリダイレクトさせます。
※Prefixについての詳しい説明は「link_toの使い方を徹底解説!」の記事を参照してください。
1
2
3
4
redirect_to Prefix名
# rootにリダイレクト
redirect_to root_path
アクションで指定
同一コントローラーの指定したアクションにリダイレクトさせます。
1
2
3
4
redirect_to action: :アクション名
# newアクションへリダイレクト
redirect_to action: :new
指定したコントローラーのアクションで指定
指定したコントローラーの指定したアクションにリダイレクトさせます。
1
2
3
4
redirect_to controller: :コントローラー名, action: :アクション名
# usersコントローラーのshowアクションへリダイレクト
redirect_to controller: :users, action: :show
アクションの個別のリソースを指定
リダイレクトされるアクションがshowのidが1のリソースへの指定は下記のように記述します。
1
2
# usersコントローラーのshowアクションにid=1を渡す
redirect_to controller: :users, action: :show, id: 1
前のページを指定
現在開いている前のページへリダイレクトさせます。
1
redirect_to :back
ステータスコードを指定してリダイレクトさせよう
ステータスコードとはwebサーバーからのレスポンスの意味を数字3桁で表したコードです。
redirect_toではステータスコードを指定して実行させることができます。
指定方法は下記のように記述します。
1
redirect_to リダイレクト先の指定, status: :シンボル名
シンボル名 | コード | 説明 |
---|---|---|
:ok | 200 | リクエストが成功し、正常なレスポンスが返った |
:created | 201 | リクエストが成功し、リソースの生成に成功 |
:moved_permanently | 301 | リソースが永続的にリダイレクトされる |
:found | 302 | リソースが意図的にリダイレクトされる |
:see_other | 303 | リソースが別の場所にある |
:bad_request | 400 | 不正なリクエストである |
:unauthorized | 401 | 未承認のためリクエストは失敗 |
:forbidden | 403 | アクセス禁止のためリクエストは失敗 |
:not_found | 404 | リソースが存在しないためリクエストは失敗 |
:method_not_allowed | 405 | HTMLメソッドが許可されていない |
:internal_server_error | 500 | 内部サーバエラー |
下記のように定義するとnewアクションへステータスコード302でリダイレクトさせます。
1
redirect_to action: :new, status: :found
リダイレクトした時のメッセージを表示させよう
redirect_toでnoticeやalertを使うことによりフラッシュメッセージを設定し、メッセージを表示させることができます。
フラッシュメッセージを表示させるには下記のように記述します。
1
redirect_to root_path, notice: '成功しました'
ビューファイルには表示させたい場所に下記のように記述します。
1
<%= notice %>
renderメソッドとの違い
redirect_to
は指定したパスへリダイレクトさせることができますが、似たようなメソッドにrenderメソッド
があります。
この二つのメソッドの違いはアクションを通してビューを表示させるか、させないかの違いがあります。
redirect_to
は1回指定したアクションを実行して、そのアクションに対応したビューを表示させます。
それに対してrender
はアクションを実行せずにビューファイルを表示させます。
ですのでビューファイルにアクションで取得するインスタンス変数がある場合はエラーとなります。
そのような場合はredirect_toでリダイレクト先を指定しましょう。
より詳しい解説は「renderメソッドを徹底解説!」の記事を参照してください。
redirect_toを使うときの注意点
redirect_to
や、上で紹介したrender
を使うときの注意点があります。
それは各アクション内で複数のredirect_to
やrender
を指定できないということです。
例えば下記のような場合です。
1
2
3
4
5
6
7
def create
message = Message.new(message_params)
if message.save
redirect_to action: :index
end
render :new
end
このような場合、redirect_to
でindexアクションが実行された後、indexのビューが呼び出され、次のコードのrender
でnewアクションのビューが呼び出されてしまいます。この場合はDoubleRenderというエラーが出てしまいます。
このエラーを防ぐには、下記のようにand return
を使用します。
1
2
3
4
5
6
7
def create
message = Message.new(message_params)
if message.save
redirect_to action: :index and return
end
render :new
end
redirect_to
を使えばcreateアクションが実行された後indexアクションのビューファイルを表示させることもできるので、わざわざcreateアクションのビューファイルを作成する必要がなく便利ですね。
and returnの別の使い方
「DoubleRenderError」を防ぐ目的以外でもredirect_to
以降の処理をさせたくない時、and return
を使用します。
下記の例を見てみましょう。
1
2
3
4
5
6
7
def create
redirect_to root_path and return unless @message.user_id == current_user.id
@message = Message.new(create_params)
if @message.save
~~
end
end
上のコードはログインしているユーザーがメッセージを投稿していないと保存されないようにしています。
and return
がないと次のコードを読みに行ってしまい、保存されてしまいますね。
ですので、and return
で処理を止めているというわけです。
このようにredirect_to
を使う時にはand return
が必要な時があるということも覚えておきましょう。
この記事のまとめ
- redirect_toは遷移するURLを指定できるメソッド
- オプションを使うとステータスコードも変更することができる
- Ruby on Railsについて一通り学びたい方は、こちらの参考書もよく使われているよ!