为什么Flash消息不会消失?


78

我正在控制器中进行一些异常处理,当:create操作中引发异常时,我将呈现为:new操作并显示一条Flash消息。

一切正常,当捕获到异常时,我可以看到Flash消息,但是当我重定向到(手动单击)其他页面时,Flash消息仍在此处。然后我重定向到另一个页面(第二次单击),消息可能消失。

有谁知道原因吗?

我的控制器代码:

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]

Answers:


162

更换

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

flash.now.alert = t("uploading_error")

看看那是您期望的结果吗?

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


优秀的解决方案和链接!谢谢zabba!
Jimmy Huang

1
现在,我对flash和flash.now有了更多了解。因此,如果我使用redirect_to而不是render,那么使用flash也不会有问题。
Jimmy Huang

1
仅供参考:链接已断开。但是没有看到链接,我不得不承认我很好奇为什么flash.now [:alert]不是默认设置。
2012年

您的网站暂时无法访问:P
拉斐尔2012年


45

在flash.now和常规Flash之间进行选择是一个痛苦的尝试,而根据我的经验来说,它非常脆弱。我使用常规Flash,然后修改显示Flash的我的局部Flash,以在用户看到它之后删除每个Flash的内容。我认为这更好,因为

a)您不必考虑

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

我的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>

也许这是一个愚蠢的问题,但是这样做是否有可能删除将要渲染的另一个Flash?
布拉德福德

@布拉德福德-我不这么认为:我只需要清除渲染的三个闪存键即可。没有渲染就无法清除它们,并且渲染和清除它们之间不会发生任何事情,因为清除发生在同一部分中。
Max Williams

游戏晚了,但是我喜欢这个。
丹·巴伦

1
我刚试过 我认为flash.discard(a_single_key)更好,因为将值设置为nil不会从闪存中删除密钥。结果,对于已删除的密钥,它可能会显示一条空消息。
TrongBang

34

一种替代方法是在部分内容的末尾使用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 %>

flash.clear比<%flash [:error] = flash [:errors] = flash [:notice] = nil%>干净得多
Kevin

以我的经验,这是最好的方法,除非您需要保留Flash消息。我不知道为什么默认情况下flash.clear不附带模板(也许是脚手架?)。
拉文斯汀

2
flash.clear对我不起作用。闪光灯仍然没有消失
Nimish '16


1

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

尝试使用语法错误尝试解决方案...您应该看到您的消息不会显示在重定向页面中,除非带有会话密钥。


1

以前我遇到过同样的问题,但是现在通过以下方法解决了:
在您的代码中尝试一下

<script type="text/javascript">
  $(document).ready(function(){
    setTimeout(function(){
    $('#flash').fadeOut();
    }, 2000);
  })
</script>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.