2012-10-08 75 views
0

我有一個用rails寫的應用程序。我有閃光消息顯示用戶說他成功登錄或創建或更新了他的個人資料。一旦用戶登錄了一個閃光消息(「歡迎」),並且用戶導航到不同的頁面。如果用戶點擊返回按鈕,則再次顯示閃光消息(「歡迎」)。禁用Flash消息而不禁用緩存點擊後退按鈕在RAILS

我不想禁用緩存,因爲它會影響性能。

任何想法來解決這種情況將是有益的。

謝謝。

回答

0

嘗試使用Flash.now代替:

flash.now[:notice] = "Welcome" 

相比於閃光法只顯示直到執行下一個動作的消息。顯示正常的閃光消息,直到下一個請求發送到服務器。我希望它有幫助。

+0

我看到相同的行爲..點擊後退按鈕後,Flash消息再次出現。 – LS2

+0

也許嘗試使用AJAX。 – pawurb

+0

flash和flash.now之間的區別在本教程的第8.1.5節中有很好的解釋:http://ruby.railstutorial.org/chapters/sign-in-sign-out – pawurb

0

這是通過搜索引擎來到這個問題的人。

問題

當回用戶點擊按鈕,一個新的請求,而不是服務器,而會顯示瀏覽器的緩存副本做。但是,在第一次請求期間,瀏覽器已經緩存了該Flash消息,並且在單擊後退按鈕時,該Flash消息再次顯示。

解決方案

一種方法來解決這個問題是使用瀏覽器的的localStorage或sessionStorage的。

更改您的代碼,以便通過javascript顯示或隱藏Flash消息。當顯示Flash消息時,將該事實存儲在瀏覽器的sessionStorage中。 下一次,檢查是否已顯示Flash消息,如果是,請不要再次顯示。

我更喜歡使用sessionStorage而不是localStorage,因爲sessionStorage在關閉瀏覽器時得到清理。如果你有太多的Flash消息,這很有幫助。否則,您將不得不編寫用於刪除較舊條目的邏輯

# app/views/layouts/application.html.erb - or wherever your flash messages reside 

... 
<% 
    flash_name_mappings = { 
    "notice" => "success", 
    "error" => "danger", 
    "alert" => "warning" 
    } 
%> 

<% flash.each do |name, msg| %> 
    <% if msg.is_a?(String) %> 
    <% flash_token = Time.current.to_s(:number) # or use any other random token generator, like Devise.friendly_token %> 

    <div id="flash-<%= flash_token %>" style="display:none" class="alert alert-<%= flash_name_mappings[name] || name %>"> 
     <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> 
     <%= content_tag :div, msg.html_safe, id: "flash_#{name}" %> 
    </div> 

    <script type="text/javascript"> 
     $(document).ready(function(){ 
     if (typeof(Storage) !== "undefined") { 
      // Code for localStorage/sessionStorage. 
      if(sessionStorage["flash-<%= flash_token %>"] != "shown"){ 
      $("#flash-<%= flash_token %>").show(); 
      sessionStorage["flash-<%= flash_token %>"] = "shown"; 
      } 
     } else { 
      // Sorry! No Web Storage support.. 
      $("#flash-<%= flash_token %>").show(); 
     } 
     } 
    </script> 
    <% end %> 
<% end %> 

...