renderとredirect_toの違い
render
下記コードの場合 indexアクションを介さずにindex.html.erbが表示される
※注意点 index.html.erbはcreateアクション内で実行される為
もしindex.html.erb内に@booksなどのcreateアクション内にない変数があるとエラーになるのでしっかり定義する
def create @books = Book.all #index.html.erb内に@booksをいう変数があれば定義する @book = Book.new(book_params) if @book.save flash[:notice] = "Book was successfully created." redirect_to book_path(@book.id) else render :index end end
redirect_to
上記コードの場合
showアクションが実行されてから、show.html.erbが表示される
renderを使うと良い場合
例えば上記コードのrenderをredirect_toにすると下記のコードになる
def create @books = Book.all #index.html.erb内に@booksをいう変数があれば定義する @book = Book.new(book_params) if @book.save flash[:notice] = "Book was successfully created." redirect_to book_path(@book.id) else redirect_to :index end end
この場合
def index @books = Book.all @book = Book.new end
indexアクションが実行されてindex.html.erbが表示される
となると@bookのindexアクション内のBook.newとなり、中身は空になる
空になると何が困るか?
例えば、バリデーションで100文字以下という条件をつけた場合
ユーザーが101文字入力してエラーが発生した
この時redirect_toにしていると
@bookの中身はindexアクション内のBook.newなので空ということになる
せっかく入力した101文字が消えてしまう・・・・
その反面renderの場合
createアクション内で実行しているので
@bookの中身は残ったままなのでユーザーは文字を少なくするだけで修正することができる