2011-08-01 57 views
0

用户注册我的应用程序会显示存储在闪存中的成功或错误消息。问题是,如果用户注册失败,则会显示消息。但是,如果用户离开该页面,则该Flash消息仍然显示在任何一个页面中。如果刷新该页面,它会消失。错误消息离开页面后出现闪烁错误消息(Rails)

这是用户控制器的相关的代码:

def create 
    @user = User.new(params[:user]) 

    if @user.save 
     flash[:status] = {} 
     flash[:status][:type], flash[:status][:message] = 'success', 'Welcome to secondappr' 
     redirect_to @user 
    else 
     flash[:status] = {} 
     flash[:status][:type], flash[:status][:message] = "error", "#{pluralize(@user.errors.count, 'error')} caused your signup attempt to FAIL:" 
     flash[:details] = @user.errors.full_messages.each { |e| e } 
     @user.password = '' 
     @user.password_confirmation = '' 
     @title = "Sign up#{ @puns.sample }"  
     render 'new' 
    end 
    end 

这是一个显示闪光消息的应用程序的布局视图的一部分:

<% if flash.any? %> 
<div class='flash <%= flash[:status][:type]%>'> 
    <%= content_tag(:strong, flash[:status][:message]) %> 
    <ul class="details"> 
     <% if flash[:details] %> 
      <% flash[:details].each do |d| %> 
       <%= content_tag(:li, d) %> 
      <% end %> 
     <% end %> 
    </ul> 
</div> 
<% end %> 

回答

3

这是发生,因为flash的请求之间清除。

根据注册是否成功,您的create方法会产生不同数量的请求。如果是,则redirect_to会创建一个新请求,该请求会显示并清除flash。这是所需的行为。

注册失败时,您正在设置flash,然后呈现一个视图,该视图不会像重定向那样创建新的请求。这意味着您的Flash消息显示在当前请求中,并且在之后以下请求才会被清除。这就是为什么它似乎持续一个额外的页面视图。

这正是flash.now设计的情况。从文档:

设置一个闪光灯,将不会提供给下一个动作,只有当前。

flash.now[:message] = "Hello current action"

此方法使您能够使用闪光灯作为您的应用程序中心的邮件系统。当您需要将对象传递给下一个操作时,可以使用标准的Flash分配([] =)。当您需要将对象传递给当前操作时,您现在可以使用该对象,并且当前操作完成后,对象将消失。

通过现在设置的条目以与标准条目相同的方式访问:flash['my-key']

2

通常flash将适用于下一个请求。在你的情况下,如果用户不能被保存,你在当前请求内渲染,而不是重定向到新的。所以,你需要使用flash.now代替(只有你else块内):

else 
    flash.now[:status] = {} 
    flash.now[:status][:type], flash.now[:status][:message] = "error", "#{pluralize(@user.errors.count, 'error')} caused your signup attempt to FAIL:" 
    flash.now[:details] = @user.errors.full_messages.each { |e| e } 
    @user.password = '' 
    @user.password_confirmation = '' 
    @title = "Sign up#{ @puns.sample }"  
    render 'new' 
end 
+0

谢谢。虽然这有点令人困惑,不是吗?我没有真正理解它 –