如何在Rails中的请求之间保持flash消息?

时间:2013-04-01 07:53:23

标签: ruby-on-rails

我正在关注的教程下面提到的代码并不完全正确,因为错误闪存持续时间超过了一个请求,因为render并不算作请求。解决方案是使用flash.now代替。

但是错误闪存甚至可以持续一个额外的请求呢?鉴于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

2 个答案:

答案 0 :(得分:4)

使用flash.now代替flash

flash变量旨在在重定向之前使用,并且在结果页面上持续存在一个请求。这意味着如果我们不重定向,而只是简单地呈现页面,则flash消息将持续存在两个请求:它出现在呈现的页面上但仍在等待重定向(即第二个请求),因此消息如果您点击链接,它将再次出现。

为了避免这种奇怪的行为,在渲染而不是重定向时,我们使用flash.now而不是flash。

答案 1 :(得分:1)

闪存存储在用户Session中,该用户使用HTTP Cookie在后续请求中与它们相关联。闪存只是会话的一部分,其数据在下一个请求时自动刷新。有关详细信息,请参阅Rails Guide to Action Controller