3

render私がフォローしているチュートリアルには、リクエストとしてカウントされないため、エラーフラッシュが1つのリクエストを必要以上に長く持続させるため、それが言及している以下のコードがあります。flash.now解決策は、代わりに使用することです。

しかし、エラー フラッシュが 1 つの余分な要求を保持することはどうして可能なのでしょうか? Rails がステートレスであることを考えると、フラッシュの情報は次のリクエストのためにどのように保存されるのでしょうか?

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by_email(params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      # Sign the user in and redirect to the user's show page.
    else
      flash[:error] = 'Invalid email/password combination' # Not quite right!
      render 'new'
    end
  end

  def destroy
  end
end
4

2 に答える 2

6

flash.nowの代わりに使用しflashます。

flash 変数は、リダイレクトの前に使用することを意図しており、1 つのリクエストの結果のページに保持されます。これは、リダイレクトせずにページをレンダリングするだけの場合、Flash メッセージは 2 つのリクエストの間存続することを意味します。レンダリングされたページに表示されますが、リダイレクト (つまり、2 番目のリクエスト) を待っているため、メッセージはリンクをクリックすると再び表示されます。

この奇妙な動作を回避するために、リダイレクトではなくレンダリングするときに、flash の代わりに flash.now を使用します。

于 2015-02-04T09:27:09.620 に答える