Labyrinth of Wisdom

-This is My Archive-


redirect_to と render の違いについて

Rails-4.25

上記のメソッドの使い方の違いが曖昧だったので調べてみました。
ざっくり結論から言うと、

  • redirect_toはアクションそのものを呼び出してページを遷移する
  • renderはアクションはそのままだけどviewだけ指定ものを使用する(controllerの変数などはそのまま)

という具合です。
例えばindex.html.erbindexアクションで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