※この記事は私の勘違いが含まれています。正確な内容はコメント欄でご指摘頂いている通りです。
ツイッターのようなツイートアプリを作成中なのですが、表題の通りrenderとredirect_toの違いってなんや?
と思い私なりの結論が出たのでアウトプットのため、記事にしています。
結論
- renderは同じコントローラー内のファイルしか基本読み込まないため、同じコントローラーのビューファイルを表示されることに向いている。
- redirect_toはurlを指定できるので、別のコントローラーのindexのビューファイルを表示させたい場合に向いている。
この結論に至った経緯は以下の通りです。
まずは以下のコードを見てください。
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のビューファイル)へ戻すというものです。
ではredirectをrenderに変えた場合どうなるのか考えてみました。
def update
if current_user.update(user_params)
render template : "messages/index"
else
render :edit
これで同じになったやろ!
と思ったらエラーになりました。
原因はmessage/indexのビューファイルは部分テンプレートを使用していたからでした。
<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はリクエストがルーティングに戻されるので別コントローラーのビューファイルを表示させる時に使う。