3

我正在关注的教程有以下代码,它提到的代码不太正确,因为错误闪存持续一个请求的时间比预期的要长,因为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
4

2 回答 2

6

使用flash.now而不是flash.

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

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

于 2015-02-04T09:27:09.620 回答
1

flash 存储在用户的Session中,该 Session 在使用 HTTP cookie 的后续请求中与他们相关联。闪存只是会话的一部分,其数据会在下一次请求时自动刷新。有关详细信息,请参阅动作控制器的 Rails 指南

于 2013-04-01T07:58:23.783 回答