Rails闪存通知不会在Safari中消失?

时间:2013-12-08 06:37:58

标签: ruby-on-rails safari

我有一个管理学生的Rails 3.2应用程序。它在顶部(基础5)有一个相当典型的导航栏,其中包含一个快速搜索字段。导航栏显示在站点的每个页面上。

如果您在搜索字段中输入有效(数字)学生ID,则只需跳转到该学生的页面即可。如果输入文本或其他非数字输入,则会出现闪烁错误,要求输入有效内容。如果您输入了未找到的ID,则会收到一条闪存通知,说明找不到该ID。在后两种情况中的任何一种情况下,控制器应该让您回到您来自的任何页面并显示相应的Flash消息。

对于初学者来说,这是视图中的搜索字段:

<%= form_tag search_students_path, method: 'get' do %>
<div id="nav-search" class="row collapse">
  <div id="nav-search-field" class="small-21 columns">
    <%= text_field_tag :search, nil, autocomplete: 'off' %>
  </div>
  <div id="nav-search-icon" class="small-3 columns">
    <%= submit_tag '&#xf002;'.html_safe, class: 'button fa fa-search spin', name: 'submit' %>
  </div>
</div>
<% end %>

这是控制器动作:

def search
  session[:return_to] ||= request.referer
  if params[:search].to_i.zero?
    flash[:error] = %Q[<i class="fa fa-times fa-fw"></i> Please enter a numeric student ID.].html_safe
    redirect_to session.delete(:return_to)
  else
    id = params[:search].to_i.abs
    @student = Student.search(id).first
    if @student
      redirect_to @student
    else
      flash[:caution] = %Q[<i class="fa fa-warning fa-fw"></i> Sorry, we couldn't find a student with ID #{id}.].html_safe
      redirect_to session.delete(:return_to)
    end
  end
end

最后,这是在application.html.erb中呈现flash消息的代码:

<% flash.each do |key, value| %>
  <div data-alert class="alert-box cbc-<%= key %>">
    <%= value %>
    <a href="#" class="close">&times;</a>
  </div>
<% end %>

在Chrome和FireFox中,这完全符合预期。闪光灯出现一个请求,然后消失。但是,在Safari中,一旦闪存出现,它就永远不会消失。因此,例如,如果您在主页上出现错误,则可以刷新所需的全部内容。它保持不变。你可以去另一个页面,然后回来,它仍然存在。其他页面也是如此。一旦Flash消息出现在给定页面上,它就不会消失。

因此我的问题是:如何在第一次请求后让Safari清除闪存?

我在渲染页面时意识到整个“flash vs. flash.now”问题。但即使这样,如果你只是刷新,闪光灯也会消失。在这种情况下,我实际上尝试过flash.now,但是在任何浏览器中都没有显示flash。

由于这似乎是特定于浏览器的问题,因此以下是我系统上的一些进一步统计信息:

  • Mac OS X 10.9
  • Safari 7.0
  • Rails 3.2.16

最后一个观察结果。在Safari中解决了这个问题之后,我注意到如果我单击http://localhost:3000/的书签,那将清除闪存。当然,我的站点布局中的所有导航链接都包含相对路径,而书签则调用完整的URL。

无论如何,希望这是有道理的。在此先感谢您的帮助!

0 个答案:

没有答案