2010-10-20 178 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變量。