为啥闪信不会消失?

Posted

技术标签:

【中文标题】为啥闪信不会消失?【英文标题】:Why flash message won't disappear?为什么闪信不会消失? 【发布时间】:2011-06-04 13:52:43 【问题描述】:

我正在我的控制器中进行一些异常处理,当 :create 动作中抛出异常时,我将渲染到 :new 动作并显示一个 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]

【问题讨论】:

【参考方案1】:

替换

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

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

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

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

【讨论】:

优秀的解决方案和链接!谢谢zabba! 现在我对 flash 和 flash.now 有了更多的了解。所以如果我使用redirect_to而不是render,使用flash也没有问题。 仅供参考:链接已损坏。但是没有看到链接,我不得不承认我很好奇为什么 flash.now[:alert] 不是默认值。 您的网站暂时无法访问:P Rails doc 也有一些不错的 info on flash and flash.now【参考方案2】:

我还建议在显示时清除 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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

另一种方法是在部分末尾使用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 消息。我不知道为什么模板(也许脚手架可以?)默认情况下不附带 flash.clear。 flash.clear 不适合我。 Flash 仍然没有消失【参考方案5】:

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

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

【讨论】:

【参考方案6】:

在 flash.now 和常规 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? @Bradford - 我不这么认为:我只是清除了我渲染的三个闪存键。没有被渲染它们就不可能被清除,并且在它们被渲染和清除之间不会发生任何事情,因为清除发生在同一个部分。 游戏迟到了,但我喜欢这个。 我刚试过这个。我认为 flash.discard(a_single_key) 更好,因为将值设置为 nil 不会从闪存中删除密钥。因此,它可能会为已删除的键显示一条空消息。

以上是关于为啥闪信不会消失?的主要内容,如果未能解决你的问题,请参考以下文章

Android:Google Maps Clustermanager 行为异常。群集图标有时在全放大时不会消失。为啥?

li 在 Angular 中路由到不同的 html 页面时不会消失,为啥?

为啥崩溃会随着“僵尸对象”而消失?

为啥有时我按下 AnnotationView 时图像消失了?

为啥微信云宅调小程序里面的信息突然消失?

为啥功能动作直到刷新才停留,但在点击后突然消失[重复]