禁用Flash消息而不禁用缓存单击后退按钮在RAILS中

时间:2012-10-08 10:22:20

标签: ruby-on-rails ruby

我有一个用rails编写的应用程序。我有flash消息显示用户说他已成功登录或创建或更新了他的个人资料。一旦用户登录闪存消息(“欢迎”),则用户导航到不同的页面。如果用户单击“返回”按钮,则会再次显示闪烁消息(“欢迎”)。

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

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

感谢。

2 个答案:

答案 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">&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 %>

...