すでにメンバーの場合は

無料会員登録

GitHubアカウントで登録 Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

登録がまだの方はこちらから

Pikawakaにログイン

GitHubアカウントでログイン Pikawakaが許可なくTwitterやFacebookに投稿することはありません。

Rails

【Rails】 redirect_toの使い方を理解して指定したURLに遷移させよう

ぴっかちゃん
ぴっかちゃん

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

コントローラ | redirect_toメソッドの基本構文
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_torenderを指定できないということです。

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

コントローラー -->
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について一通り学びたい方は、こちらの参考書もよく使われているよ!