morooka ryosuke  2021/04/01更新

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の中身は残ったままなのでユーザーは文字を少なくするだけで修正することができる


タイトルとURLをコピーしました