【整理】render&redirect_toが、ごっちゃになってしまうあなたへ


対象者

なんかredirect_toとかrenderとかそれぞれどんな違いあるんだっけ?使い方は?と、知ってるけど頭の中で整理できていない方

前提知識

Railsのコントローラにおけるアクションでは、最終的にrenderされてビューを返す仕組みになっている。
つまり、1アクションにつき、1renderが必ず起こる。

def index
end

これは、render 'index'が発動していることと同じことである。

エラー例

renderが2回処理されてしまう時

def show
  ~~
    if ~~
      ~~
      render 'index'
    end
  render 'show'
end

解決策としては、returnをしてあげる

def show
  ~~
    if ~~
      ~~
      render 'index'
      return
    end
  render 'show'
end

render

アクション内で、呼び出すビューを指定するメソッド。
つまり、デフォルトで呼び出されるビュー以外のものを呼び出すことができる。
呼び出すビューの形式は、RHTML形式(.html / html.erb等)

  • 同じコントローラの別アクションビューを呼び出す時
microposts_controller.rb
def index
  render 'edit'
  render :edit
end
  • 別コントローラのアクションビューを呼び出す時
microposts_controller.rb
def index
  render "users/show"
  render template: "users/show"
end
  • 別ディレクトリや別アプリのアクションビューを呼び出す時
microposts_controller.rb
def index
  render "/warehouse_app/app/views/products/show"
  render file: "/warehouse_app/app/views/products/show"
end

redirect_to

指定したURLへGETリクエストを送信するメソッド。
つまり、アクション内で発動すれば、再度RCVを呼び出すことになる。

  • 指定のページに飛ばす
microposts_controller.rb
def index
  redirect_to root_url
end
  • 直前のページに戻す
microposts_controller.rb
def index
  redirect_back(fallback_location: root_path)
end

参考にさせていただきました

Railsガイドライン
https://railsguides.jp/layouts_and_rendering.html#render%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B

@1ulce様
https://qiita.com/1ulce/items/282cccba1e44158489c8

@morikuma709様
https://qiita.com/morikuma709/items/e9146465df2d8a094d78