LoginSignup
0
1

More than 3 years have passed since last update.

renderメソッドとredirect_toの違い

Last updated at Posted at 2020-07-27

※この記事は私の勘違いが含まれています。正確な内容はコメント欄でご指摘頂いている通りです。

 ツイッターのようなツイートアプリを作成中なのですが、表題の通りrenderとredirect_toの違いってなんや?
と思い私なりの結論が出たのでアウトプットのため、記事にしています。

結論

  • renderは同じコントローラー内のファイルしか基本読み込まないため、同じコントローラーのビューファイルを表示されることに向いている。
  • redirect_toはurlを指定できるので、別のコントローラーのindexのビューファイルを表示させたい場合に向いている。

この結論に至った経緯は以下の通りです。
まずは以下のコードを見てください。

app/controllers/users_controller.rb
class UsersController < ApplicationController

  def edit
  end

  def update
    if current_user.update(user_params)
      redirect_to root_path
    else
      render :edit
    end
  end

  private

  def user_params
    params.require(:user).permit(:name, :email)
  end
end

これはユーザー管理用のusersコントローラーの記述です。
updeteアクションで、ユーザーアカウントの編集ができた場合はroot_path(messageコントローラーのindexアクション)へリダイレクトする。
できなかった場合はrender :editで再度編集画面(usersコントローラーのeditのビューファイル)へ戻すというものです。

ではredirectrenderに変えた場合どうなるのか考えてみました。

def update
    if current_user.update(user_params)
      render template : "messages/index"
    else
      render :edit

これで同じになったやろ!
と思ったらエラーになりました。
原因はmessage/indexのビューファイルは部分テンプレートを使用していたからでした。

app/views/messages/index.html.erb
<div class="wrapper">
  <div class="side-ber">
    <%= render "side_bar" %>
  </div>
  <div class="chat">
    <%= render "main_chat" %>
  </div>
</div>

 ここでmessagesフォルダ内にある部分テンプレートside_bar,main_chatを読み込むという記述があります。
 試しに部分テンプレートをapp/views/usersフォルダの直下に入れたら正常に表示されました。

以上のことからわかったこと

  • usersコントローラーからmessages/indexのビューファイルだけを呼び出した。
  • ビューファイル内に部分テンプレートを呼び出すコードがあったためusersのビューファイル内で部分テンプレートを呼び出そうとしたが部分テンプレートがないためエラーになった。

まとめ

  • 同じコントローラーのビューファイルを指定する場合はrenderの方が早い
  • redirect_toはリクエストがルーティングに戻されるので別コントローラーのビューファイルを表示させる時に使う。
0
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1