【Rails】redirectとrenderの違いは?


はじめに

redirectとrenderの違いって何だか分かりますか?
Rails初学者であれば意外と理解できていない人もいるかと思うので簡単に説明します。

ズバリ違いはこれ

違いは何かというと、コントローラを経由するかどうかです。
それぞれ処理の流れを書いてみます。

■ redirect
リクエスト送信
→ ルーティングでコントローラとアクションを特定
→ 指定のコントローラ内のアクションが動作
→ 動作したアクションに対応するビューファイルがレスポンスとして表示される

■ render
指定のビューファイルを表示

使い分けは?

良く見かける例でいくと、投稿データを保存するという処理をする場合、保存に成功した場合はredirect、失敗した場合にはrenderを使うという使い分けになるかと思います。
コードの例を使って少し説明してみます。

post_controller
def new
  @post = Post.new
end

def create
  @post = Post.new(post_params)
  if @post.save
    redirect_to root_path
  else
    render "new"
  end
end

実際の動きを動画でみてみましょう
今回は5文字以上入力しないと保存できないようにバリデーションをかけています。

保存に成功したときはルートパス(投稿データ一覧)に移動するだけというのはすぐ理解できると思います。
 保存に失敗した場合のrenderは、newのビューファイルを直接読み込みます。このときコントローラを経由しないため、ビューファイルに渡されるインスタンス変数(@post)はnewアクションのものではなく、createアクションで使われたもの(投稿データが格納されている)となります。
 こうすることで、保存失敗後にnewのビューファイルが表示されたときに、入力データを保持してくれます。
 保存失敗時にredirectを使うとnewアクションが読み込まれ、@postには新しく作られた空のインスタンスが渡されてしまうため、せっかく入力したデータが消えてしまいます。

最後に

renderは今回の使い方以外にも、部分テンプレートとして使用したり、繰り返し処理に使ったりと様々な使い方があり非常に便利なメソッドです。うまく使いこなせるようになると楽しくコーディングができると思うので、覚えておくと良いかと思います。

最後までご覧いただきありがとうございました!