renderのメリット
renderのメリットはアクションで使用していたインスタンス変数を保持したまま、viewを描画できる点です。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前に書く必要がなく、そのアクションに飛ばしてしまえるため、コードの可読性や保守性を向上させることができます。
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の組み合わせによって、次描画される画面にのみメッセージを表示させることができます。