2011-01-06 118 views
72

我在我的控制器中执行一些异常处理,当出现异常时:create action,我将渲染到:new action并显示一条flash消息。为什么flash消息不会消失?

一切工作正常,我可以看到当异常捕获闪光灯的消息,但是当我重定向到(handly点击)其他页,闪光灯消息还在这里。然后我重定向到另一个页面(第二次点击),消息可能消失。

任何人知道是什么原因?

我的控制器代码:

class MessagesController < ApplicationController 
    rescue_from Exception, :with => :render_new 

    def new 
    end 

    def create 
    end 

private 
    def render_new 
    flash[:alert] = t("uploading_error") 
    render :action => :new 
    end 
end 

我的布局代码(Haml的):

%body 
    #content 
    - unless flash[:alert].blank? 
     #alert= flash[:alert] 

回答

145

替换

flash[:alert] = t("uploading_error") 

flash.now[:alert] = t("uploading_error") 

并查看这是否是您期望的结果?

flash[:alert]将留在下一页(因此它只会在第二次重定向时消失);但flash.now[:alert]只会显示当前页面。

+0

优秀的解决方案和纽带!谢谢你zabba! – 2011-01-06 10:58:56

+1

现在我知道更多关于闪光和flash.now。因此,如果我使用redirect_to而不是渲染,使用闪光灯也不会有问题。 – 2011-01-06 12:20:39

+1

仅供参考:链接已中断。但是没有看到链接,我不得不承认我很好奇为什么flash.now [:alert]不是默认的。 – Trip 2012-03-14 15:17:58

45

在flash.now和flash之间做出决定是一件痛苦的事情,在我的经验中非常脆弱。我使用普通闪光灯,然后修改显示闪光的部分,以便在用户看到闪光灯后删除每个闪光灯的内容。我觉得这是更好,因为

一)你不必去想它

二)“已经在用户看到了吗?” (即“闪烁部分已渲染?”)是决定是否清除闪存的最佳标准,而不是您的应用中的任何逻辑。

我的闪光部分看起来像这样 - 我也用了一下jQuery的,只是为了突出闪烁(即使其闪烁黄色第二):

<div id="flashes"> 

    <% if flash[:notice] %> 
    <p id="flash_notice" class="messages notice"><%= flash[:notice] %></p> 
    <%= javascript_tag "$('#flash_notice').effect('highlight',{},1000);" %> 
    <% end %> 

    <% if flash[:error] || flash[:errors] %> 
    <p id="flash_errors" class="messages errors"><%= flash[:error] || flash[:errors] %></p> 
    <%= javascript_tag "$('#flash_errors').effect('highlight',{},1000);" %> 
    <% end %> 

    <% flash[:error] = flash[:errors] = flash[:notice] = nil %> 
</div> 
1

即使这不工作.... ..某些类型的异常,如语法错误......将阻止任何类型的cookie,闪存或参数从控制器传输到视图。您唯一的选择是使用会话密钥,然后在显示错误后清除它。

用语法错误试试你的解决方案......你应该看到你的消息不会出现在重定向页面中,除了使用会话密钥以外的其他内容。

30

另一种方法是在局部像这样结束使用flash.clear

<% if !flash.empty? %> 
    <div class="flash-messages-container"> 
    <% flash.each do |name, msg| %> 
     <% if msg.is_a?(String) && [:success, :info, :error, :warning].include?(name) %> 
     <div class="flash-message" data-type="<%= name %>" > 
      <%= msg %> 
     </div> 
     <% end %> 
    <% end %> 
    </div> 
    <% flash.clear %> 
<% end %> 
1

以前我同样的问题,但现在通过这个解决:
在你的代码试试这个

<script type="text/javascript"> 
    $(document).ready(function(){ 
    setTimeout(function(){ 
    $('#flash').fadeOut(); 
    }, 2000); 
    }) 
</script>