我有一個用rails寫的應用程序。我有閃光消息顯示用戶說他成功登錄或創建或更新了他的個人資料。一旦用戶登錄了一個閃光消息(「歡迎」),並且用戶導航到不同的頁面。如果用戶點擊返回按鈕,則再次顯示閃光消息(「歡迎」)。禁用Flash消息而不禁用緩存點擊後退按鈕在RAILS
我不想禁用緩存,因爲它會影響性能。
任何想法來解決這種情況將是有益的。
謝謝。
我有一個用rails寫的應用程序。我有閃光消息顯示用戶說他成功登錄或創建或更新了他的個人資料。一旦用戶登錄了一個閃光消息(「歡迎」),並且用戶導航到不同的頁面。如果用戶點擊返回按鈕,則再次顯示閃光消息(「歡迎」)。禁用Flash消息而不禁用緩存點擊後退按鈕在RAILS
我不想禁用緩存,因爲它會影響性能。
任何想法來解決這種情況將是有益的。
謝謝。
嘗試使用Flash.now代替:
flash.now[:notice] = "Welcome"
相比於閃光法只顯示直到執行下一個動作的消息。顯示正常的閃光消息,直到下一個請求發送到服務器。我希望它有幫助。
這是通過搜索引擎來到這個問題的人。
問題
當回用戶點擊按鈕,一個新的請求,而不是服務器,而會顯示瀏覽器的緩存副本做。但是,在第一次請求期間,瀏覽器已經緩存了該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">×</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 %>
...
我看到相同的行爲..點擊後退按鈕後,Flash消息再次出現。 – LS2
也許嘗試使用AJAX。 – pawurb
flash和flash.now之間的區別在本教程的第8.1.5節中有很好的解釋:http://ruby.railstutorial.org/chapters/sign-in-sign-out – pawurb