为什么flash消息不会消失?

时间:2011-01-06 10:31:34

标签: ruby-on-rails

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

6 个答案:

答案 0 :(得分:157)

替换

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

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

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

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

答案 1 :(得分:45)

在flash.now和普通闪光之间做出决定是一种痛苦的屁股,而且我的经历非常脆弱。我使用普通闪光然后修改我的部分显示闪光灯,以便在用户看到闪光灯后删除每个闪光灯的内容。我认为这更好,因为

a)你不必考虑它

b)“有用户看过吗?” (即“闪光部分被渲染出来?”)是决定是否清除闪光的最佳标准,而不是应用中的任何逻辑。

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

答案 2 :(得分:31)

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

答案 3 :(得分:2)

以前我遇到过同样的问题,但现在解决了这个问题:
在您的代码中尝试此操作

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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