※この記事は私の勘違いが含まれています。正確な内容はコメント欄でご指摘頂いている通りです。
ツイッターのようなツイートアプリを作成中なのですが、表題の通り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はリクエストがルーティングに戻されるので別コントローラーのビューファイルを表示させる時に使う。