【Rails】redirect_toの使い方を徹底解説!

Rails

redirect_toとは

redirect_toは指定したURLに遷移させることができるメソッドです。

railsではパスが送られるとルーティングで決められたコントローラーのアクションが実行されます。
redirect_toを使うと決められたコントローラーのアクション以外のアクションなどを実行させ、選択したビューファイルを表示させることができます。

redirect_toの書き方

redirect_toメソッドは下記のように定義します。

ruby
1
redirect_to "リダイレクト先"

リダイレクト先はURLの他にも指定することができます。

リダイレクト先の指定方法

redirect_toではリダイレクト先をいろいろな方法で指定できます。
どのような指定方法があるのか確認していきましょう。

URLで指定

指定したURLにリダイレクトさせます。

ruby
1
2
3
4
redirect_to "URL"

# ピカわか!のトップページへリダイレクト
redirect_to "http://www.pikawaka.com"

Prefixで指定

Prefixで指定したアクションにリダイレクトさせます。
※Prefixについての詳しい説明は「link_toの使い方を徹底解説!」の記事を参照してください。

ruby
1
2
3
4
redirect_to Prefix

# rootにリダイレクト
redirect_to root_path

アクションで指定

同一コントローラーの指定したアクションにリダイレクトさせます。

ruby
1
2
3
4
redirect_to action: :アクション名

# newアクションへリダイレクト
redirect_to action: :new

指定したコントローラーのアクションで指定

指定したコントローラーの指定したアクションにリダイレクトさせます。

ruby
1
2
3
4
redirect_to  controller: :コントローラー名, action: :アクション名

# usersコントローラーのshowアクションへリダイレクト
redirect_to  controller: :users, action: :show

アクションの個別のリソースを指定

リダイレクトされるアクションがshowのidが1のリソースへの指定は下記のように記述します。

ruby
1
2
# usersコントローラーのshowアクションにid=1を渡す
redirect_to  controller: :users, action: :show, id: 1

前のページを指定

現在開いている前のページへリダイレクトさせます。

ruby
1
redirect_to :back

ステータスコードを指定してリダイレクトさせよう

ステータスコードとはwebサーバーからのレスポンスの意味を数字3桁で表したコードです。
redirect_toではステータスコードを指定して実行させることができます。
指定方法は下記のように記述します。

ruby
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でリダイレクトさせます。

ruby
1
redirect_to action: :new, status: :found

リダイレクトした時のメッセージを表示させよう

redirect_toでnoticeやalertを使うことによりフラッシュメッセージを設定し、メッセージを表示させることができます。

フラッシュメッセージを表示させるには下記のように記述します。

ruby
1
redirect_to  root_path, notice: '成功しました'

ビューファイルには表示させたい場所に下記のように記述します。

erb
1
<%= notice %>

renderメソッドとの違い

redirect_toは指定したパスへリダイレクトさせることができますが、似たようなメソッドにrenderメソッドがあります。
この二つのメソッドの違いはアクションを通してビューを表示させるか、させないかの違いがあります。

redirect_toは1回指定したアクションを実行して、そのアクションに対応したビューを表示させます。
それに対してrenderはアクションを実行せずにビューファイルを表示させます。
ですのでビューファイルにアクションで取得するインスタンス変数がある場合はエラーとなります。
そのような場合はredirect_toでリダイレクト先を指定しましょう。

より詳しい解説は「renderメソッドを徹底解説!」の記事を参照してください。

redirect_toを使うときの注意点

redirect_toや、上で紹介したrenderを使うときの注意点があります。
それは各アクション内で複数のredirect_toやrenderを指定できないということです。

例えば下記のような場合です。

ruby
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」を使用します。

ruby
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」を使用します。
下記の例を見てみましょう。

ruby
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を指定できるメソッドです
・オプションを使うとステータスコードも変更することができます