2

我有一个用 Rails 编写的应用程序。我有显示用户说他成功登录或创建或更新他的个人资料的闪烁消息。一旦用户登录,就会显示一条 Flash 消息(“欢迎”)并且用户导航到不同的页面。如果用户单击 BACK 按钮,则再次显示 Flash 消息(“Welcome”)。

我不想禁用缓存,因为它会影响性能。

解决这种情况的任何想法都会有所帮助。

谢谢。

4

2 回答 2

2

这适用于通过搜索引擎提出这个问题的人。

问题

当用户单击后退按钮时,不会向服务器发出新请求,而是显示浏览器的缓存副本。但是,在第一次请求期间,浏览器已经缓存了 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 %>

...
于 2017-01-29T13:33:12.997 回答
0

尝试改用 Flash.now:

flash.now[:notice] = "Welcome"

与 flash 方法相比,它仅在执行下一个操作之前显示消息。显示正常的闪烁消息,直到下一个请求发送到服务器。我希望它有所帮助。

于 2012-10-08T11:40:49.003 回答