为什么闪光消息不会消失?

我正在做一些exception处理在我的控制器,当有一个exception抛出:create action,我将渲染到:新行动,并显示一个flash消息。

一切工作正常,我可以看到exception捕获时的flash消息,但是当我redirect到(handly click)其他页面时,flash消息仍然在这里 。 然后我redirect到另一个页面( 第二次点击) ,消息可能消失。

谁知道是什么原因?

我的控制器代码:

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] 

更换

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

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

看看这是你期望的结果吗?

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

在flash.now和flash之间做出决定是一种痛苦,在我的经验中是相当脆弱的。 我使用普通的闪光灯,然后修改显示闪光的部分,以便在用户看过之后删除每个闪光灯的内容。 我觉得这样比较好,因为

a)你不必考虑它

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

我的闪光部分看起来像这样 – 我也使用一些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> 

另一种方法是在部分末尾使用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 %> 

即使这不起作用……某些types的exception,如语法错误…将阻止任何types的cookie,闪存或参数从控制器传输到查看。 您唯一的select是使用会话密钥,然后在显示错误之后清除它。

尝试一个语法错误的解决scheme…你应该看到你的消息将不会出现在redirect的页面与其他任何东西,除了会话密钥…..

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

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

我也build议在显示时清除flash内部的哈希值。 flash.clear将以一种干净的方式来实现:

  <% flash.each do |key, value| %> <div class="alert alert-<%= key %>"> <%= value %> </div> <% end %> <% flash.clear %> #this line clears the object 

http://api.rubyonrails.org/classes/ActionDispatch/Flash/FlashHash.html#method-i-clear