闪存在刷新时重新出现

时间:2010-10-20 03:11:55

标签: jquery ruby-on-rails

我使用javascript在我的rails应用程序中显示flash消息(基本上每个flash消息都是一个覆盖div)。

以下部分内容包含在我的主布局文件中,它负责显示闪光灯。我注意到,如果我刷新页面,同样的flash消息会再次出现。无论如何要摆脱这个?我知道我可以拨打flash.discard,虽然不确定最好的地方是什么,我不希望另一个控制器电话只是为了丢弃闪存。

<% if !flash.nil? %>
  <% if flash[:notice] %>
  <script type="text/javascript">
      //<![CDATA[
      showFlash("<%= flash[:notice] %>", "flash-notice");
      //]]>
    </script>
  <% end  %>
  <% if flash[:success] %>
  <script type="text/javascript">
      //<![CDATA[
      showFlash("<%= flash[:success] %>", "flash-success");
      //]]>
    </script>

  <% end  %>
  <% if flash[:error] %>
  <script type="text/javascript">
      //<![CDATA[
      showFlash("<%= flash[:error] %>", "flash-error");
      //]]>
    </script>
  <% end  %>
<% end  %>


function showFlash(msg, tp) {
    if ($('#flash_messages_container').length > 0) {
        flashAnimatedHide();
    }

    var flashContainer = $("<div id='flash_messages_container' class='flash-messages " +  tp  + " '></div>");
    flashContainer.prepend("<div id='flash_messages_content'>" + msg + "<span class='go-right sprite close' id='close_flash'></span></div>");
    $('body').prepend(flashContainer);
    flashContainer.animate({
        opacity : .1
    }, '500', function(){
        flashContainer.css('opacity', 1)
    })
    $('body').css('margin-top', flashContainer.outerHeight());
    $('#close_flash').click(function() {
        flashAnimatedHide();
        $('body').css('margin-top', '0');
    });
}

更新

我怀疑这种情况正在发生,因为我开始使用etags进行客户端和反向代理缓存。所以我想刷新只是加载缓存页面,其中包含flash容器中的flash消息。那么,当启用缓存时,人们如何丢弃闪存?

3 个答案:

答案 0 :(得分:3)

我之前遇到过重复的闪烁消息,似乎结果是同时但不确定是否相同的情况。

您在行动flash[:notice] = "something时使用render :action => "somepage"吗?

即。

def some_action
  flash[:notice] = "some notice"
  render :action => "other_action"
end

然后你会发现刷新后重复flash[:notice]

解决方案是改为使用flash.now

def some_action
  flash.now[:notice] = "some notice"
  render :action => "other_action"
end

并且没有其他任何东西需要改变。

请告诉我这是否无法解决您的问题。

答案 1 :(得分:0)

这是我使用的解决方案,请告诉我是否有更好的解决方案。这取决于启用cookie,值得担心的是什么?

<% if !flash.nil? %>
  <% if flash[:notice] %>
    <% cookies[:flash_notice] = flash[:notice] %>
  <% end  %>
  <% if flash[:success] %>
    <% cookies[:flash_success] = flash[:success] %>

  <% end  %>
  <% if flash[:error] %>
    <% cookies[:flash_error] = flash[:error] %>
  <% end  %>
<% end  %>

然后使用javascript显示Flash消息并删除co​​okie

function doFlash() {
    if ($.cookie("flash_success") != null) {
        showFlash(removeSpace($.cookie("flash_success")), "flash-success");
        $.cookie("flash_success", null);
    }
    if ($.cookie("flash_notice") != null) {
        showFlash(removeSpace($.cookie("flash_notice")), "flash-notice");
        $.cookie("flash_notice", null);
    }
    if ($.cookie("flash_error") != null) {
        showFlash(removeSpace($.cookie("flash_error")), "flash-error");
        $.cookie("flash_error", null);
    }
}

答案 2 :(得分:0)

解决方案(rails 3.0.5):

设置控制器的动作如下:

class MessagesController < ApplicationController
  respond_to :html, :js, :xml, :json

  def create
    @message = Message.create(params[:message])

    flash.now[:notice] = 'This is my message'

    respond_with(@message) do |format|
      format.html { redirect_to '/', :flash => flash }
    end
  end

end

正如您所看到的,我在重定向时传递了一个:flash变量。