我有一个用rails编写的应用程序。我有flash消息显示用户说他已成功登录或创建或更新了他的个人资料。一旦用户登录闪存消息(“欢迎”),则用户导航到不同的页面。如果用户单击“返回”按钮,则会再次显示闪烁消息(“欢迎”)。
我不想禁用缓存,因为它会影响性能。
解决这种情况的任何想法都会有所帮助。
感谢。
答案 0 :(得分:0)
尝试使用Flash.now:
flash.now[:notice] = "Welcome"
与flash方法相比,它仅显示消息,直到执行下一个操作。显示正常的闪存消息,直到下一个请求发送到服务器。我希望它有所帮助。
答案 1 :(得分:0)
这是针对通过搜索引擎提出这个问题的人。
<强>问题强>
当用户点击后退按钮时,不会向服务器发出新的请求,而是显示浏览器的缓存副本。但是,在第一次请求期间,浏览器已经缓存了闪存消息,并且在单击后退按钮时,闪存消息将再次显示。
<强>解决方案强>
解决此问题的一种方法是使用浏览器的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 %>
...