rails中有一个特殊的变量flash,可以用于暂存一个hash值,值的有效期直到下一个action,一般与redirect_to一同使用
比如用户注册成功后跳转到用户信息页的时候要提示注册成功(user/new -> user/:id/show)
可以这样做:
def create
@user = User.new(user_params)
if @user.save
# 用户注册成功后(User对象/实例保存成功)会新建一个flash变量,在show视图模板中会用到,一旦刷新页面,则flash失效,提示信息也即消失
flash[:success]="欢迎来到德莱联盟"
redirect_to @user
else
render 'new'
end
end
show方法中不需要任何代码,直接在show.html.erb视图中就可以使用flash这个暂存变量
<% flash.each do |key, value| %>
<div class="alert alert-<%= key %>"><%= value %></div>
<% end %>
当然也可以写在(application.html.erb),因为它的有效期是到下一个action,而每次请求都需要经过application.html.erb,所以也可以写在这里
这样跳转到show页面后,会提示一次消息,只要刷新页面或者重新跳转到其他页面,flash变量就消失了
### flash.now方法
由于flash会存活到下一次请求,而在某些情况下,我们需要它只存留在当前请求下,比如在上面的基础,进行用户登录,用户登录失败(用户名/密码错误)后,
重新渲染当前视图,由于渲染并不算是一次请求,所以渲染到当前页面并提示错误信息之后,当点击其他链接跳转到另一个页面的时候,flash变量仍然存在,这个时候
页面的错误提示仍然没有消失
def create
user = User.find_by(email: params[:session][:email].downcase)
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_to user
else
#使用flash才能确保登录成功后(先登录失败一次),错误提示消失,now表示flash值在
# 当前这次请求中有效,因为这里登录错误之后是render重新渲染页面算不上新的请求
# flash仍然会存留到下一次请求的页面中
flash.now[:error] = "用户名或密码错误"
render 'new'
end
end