我正在关注的教程下面提到的代码并不完全正确,因为错误闪存持续时间超过了一个请求,因为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
答案 0 :(得分:4)
使用flash.now
代替flash
。
flash变量旨在在重定向之前使用,并且在结果页面上持续存在一个请求。这意味着如果我们不重定向,而只是简单地呈现页面,则flash消息将持续存在两个请求:它出现在呈现的页面上但仍在等待重定向(即第二个请求),因此消息如果您点击链接,它将再次出现。
为了避免这种奇怪的行为,在渲染而不是重定向时,我们使用flash.now而不是flash。
答案 1 :(得分:1)
闪存存储在用户Session中,该用户使用HTTP Cookie在后续请求中与它们相关联。闪存只是会话的一部分,其数据在下一个请求时自动刷新。有关详细信息,请参阅Rails Guide to Action Controller。