rails中使用flash变量启用消息提醒

来源:互联网 发布:re管理器怎样改mac 编辑:程序博客网 时间:2024/06/11 16:29

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



原创粉丝点击