redirect_to と render の違いについて
Rails-4.25
上記のメソッドの使い方の違いが曖昧だったので調べてみました。
ざっくり結論から言うと、
redirect_to
はアクションそのものを呼び出してページを遷移するrender
はアクションはそのままだけどviewだけ指定ものを使用する(controllerの変数などはそのまま)
という具合です。
例えばindex.html.erb
にindex
アクションでMember
モデルから全件取得された下記のレコードが表示されているとする。
名前 | 年齢 |
---|---|
田中一郎 | 25 |
鈴木一郎 | 22 |
田中花子 | 24 |
<!-- index.html.erb --> <table> <tr> <th>名前</th><th>年齢</th> </tr> <% @members.each do |member| %> <tr> <td><%= member.name %></td><td><%= member.age %></td> </tr> <% end %> </table>
ここから田中という名前の人のみを検索したい、となった時にsearch
というアクションを呼び出し、search.html.erb
に遷移し検索結果を表示する。
# members_controller.rb # 検索フォームが空なら全件取得、そうでないなら名前をあいまい検索して search.html.erb に遷移 def search if params[:name] == "" @members = Member.all else @members = Member.where("name like ?", "%"+params[:name]+"%") end end
名前 | 年齢 |
---|---|
田中一郎 | 25 |
田中花子 | 24 |
<!-- search.html.erb --> <table> <tr> <th>名前</th><th>年齢</th> </tr> <% @members.each do |member| %> <tr> <td><%= member.name %></td><td><%= member.age %></td> </tr> <% end %> </table>
ただこの方法だと、ほとんどviewの表示形式が同じなのにも関わらず、search.html.erb
というファイルを作成しなければなりません。
サイトの形式にもよりますが、index.html.erb
のファイルをそのまま使えるとしたら、先ほどのコードは下記のように修正できます。
# 検索フォームが空ならindexアクションを呼び出し、index.html.erbに遷移 # members_pathはビューヘルパー表記 今回の場合は /members もしくは /members/index を表す # 検索フォームが空でないなら名前をあいまい検索し、searchアクションを呼び出し、index.html.erb に遷移 def search if params[:name] == "" redirect_to members_path else @members = Member.where("name like ?", "%"+params[:name]+"%") render action: "index" end end
こうすると余計なファイル(今回でいうとsearch.html.erb
)を作成しなくても検索結果が表示可能に
ります。
以上
参考
[Rails] renderとredirect_toの違い - 拝啓、シーシュポス Railsのリダイレクト(redirect_to)でよく使う5つの方法 | NESTonline Blog