2010-10-20 175 views
0

我使用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'); 
    }); 
} 

UPDATE

我怀疑这种情况正在发生,因为我开始使用的ETag为cient侧和反向代理缓存。所以我猜刷新只是加载缓存页面,其中包含Flash容器中的Flash消息。那么当启用缓存时人们如何放弃闪存?

回答

3

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

你使用flash[:notice] = "something而行动​​?

即。

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 

并没有什么改变。

请告诉我,如果这不能解决您的问题。

+0

我正在做一个flash.now [:notice] =“注销”redirect_to_back_or_default root_path。奇怪的是,我甚至没有看到最初的闪光消息。我认为我的问题与缓存有关,重复闪存的第二次刷新直接从浏览器缓存中提供(这是一个304未修改的响应),浏览器缓存版本的页面包含原始的Flash消息。不知道如何清除它。 – badnaam 2010-10-20 04:10:43

+0

'flash.now'用于'render',而'flash'用于'重定向'。如果你在'redirect'上使用'flash.now'(就你的情况而言),这些Flash信息将会丢失。如果在'render'中使用'flash',则刷新后或者转到其他页面时将复制闪烁消息。这可能是Flash的工作原理而不是缓存。 – PeterWong 2010-10-20 06:13:00

+0

顺便说一句,向下选民你能介意解释为什么投票吗? – PeterWong 2010-10-20 06:13:58

0

那么这里是我使用的解决方案,让我知道如果有什么更好的。这依赖于cookies被启用,是值得担忧的事情吗?

<% 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来显示提示信息,并删除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); 
    } 
} 
0

解决方案(轨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变量。