我有一个管理学生的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 ''.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">×</a>
</div>
<% end %>
在Chrome和FireFox中,这完全符合预期。闪光灯出现一个请求,然后消失。但是,在Safari中,一旦闪存出现,它就永远不会消失。因此,例如,如果您在主页上出现错误,则可以刷新所需的全部内容。它保持不变。你可以去另一个页面,然后回来,它仍然存在。其他页面也是如此。一旦Flash消息出现在给定页面上,它就不会消失。
因此我的问题是:如何在第一次请求后让Safari清除闪存?
我在渲染页面时意识到整个“flash vs. flash.now”问题。但即使这样,如果你只是刷新,闪光灯也会消失。在这种情况下,我实际上尝试过flash.now,但是在任何浏览器中都没有显示flash。
由于这似乎是特定于浏览器的问题,因此以下是我系统上的一些进一步统计信息:
最后一个观察结果。在Safari中解决了这个问题之后,我注意到如果我单击http://localhost:3000/
的书签,那将清除闪存。当然,我的站点布局中的所有导航链接都包含相对路径,而书签则调用完整的URL。
无论如何,希望这是有道理的。在此先感谢您的帮助!