1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】なぜ、renderとredirectを使い分けるのか?【Ruby】

Last updated at Posted at 2021-03-18

先に結論を書くと、renderとredirect_toは処理の流れが違うため、各メソッドのメリットが享受できるように使い分ける必要があります。 そのメリットについて書いていきます。

renderのメリット

renderのメリットはアクションで使用していたインスタンス変数を保持したまま、viewを描画できる点です。
render
def index
  @books = Book.all
end

def show
  @book = Book.find_by(id: params[:id])
  if @book.nil?
    render action: "index"
  end
end

上の例では、通常アクションと同viewが呼び出されるところを、renderを使うことによってことでインスタンス変数(@book)をそのまま保持してviewを表示することができます。

また、renderを使う場合メッセージを表示する際に、使われるflashメソッドは「flash.now」を使用することが多いです。

通常のflashですと、次の次の画面が描画されるまでメッセージが表示され続けてしまい意図しない表示になってしまいますが、flash.nowでは次のアクションが呼び出されるまでで、メッセージが表示されます。

redirect_toのメリット

redirect_toの特徴はrenderと違って、再度リクエストをブラウザーに投げなおさせて、再度ルーティングさせる点です。 この処理により、別画面を描画する際に再度アクションを読み込むことができます。

再度ルーティングをし直すため、redirect_toで編集していたインスタンス変数を引き継いで利用できません。

が、再度ルーティングしなおすことで、renderのようにview表示に必要な処理をrender前に書く必要がなく、そのアクションに飛ばしてしまえるため、コードの可読性や保守性を向上させることができます。

redirect_to
def index
  @books = Book.all
end

def show
  @book = Book.find_by(id: params[:id])
  if @book.nil?
    render action: "index"
  end
end

redirect_toでは、再度ルーティングしてもう一度アクションを呼び出すため、メッセージを表示させるメソッドはflashが使用されることが多いです。
flashとredirect_toの組み合わせによって、次描画される画面にのみメッセージを表示させることができます。

参考

railsガイド https://railsguides.jp/layouts_and_rendering.html#redirect-to%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B
1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?