我有一个用 Rails 编写的应用程序。我有显示用户说他成功登录或创建或更新他的个人资料的闪烁消息。一旦用户登录,就会显示一条 Flash 消息(“欢迎”)并且用户导航到不同的页面。如果用户单击 BACK 按钮,则再次显示 Flash 消息(“Welcome”)。
我不想禁用缓存,因为它会影响性能。
解决这种情况的任何想法都会有所帮助。
谢谢。
我有一个用 Rails 编写的应用程序。我有显示用户说他成功登录或创建或更新他的个人资料的闪烁消息。一旦用户登录,就会显示一条 Flash 消息(“欢迎”)并且用户导航到不同的页面。如果用户单击 BACK 按钮,则再次显示 Flash 消息(“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.now:
flash.now[:notice] = "Welcome"
与 flash 方法相比,它仅在执行下一个操作之前显示消息。显示正常的闪烁消息,直到下一个请求发送到服务器。我希望它有所帮助。