Уведомление о рельсовой вспышке не исчезнет в Safari?
У меня есть приложение Rails 3.2, которое управляет студентами. Он имеет довольно типичную навигационную панель сверху (Foundation 5), которая содержит поле быстрого поиска. Панель навигации отображается на каждой странице сайта.
Если вы введете действительный (числовой) идентификатор студента в поле поиска, вы просто перейдете на страницу этого студента. Если вы вводите текст или другой нечисловой ввод, вы получаете ошибку флэш-памяти, запрашивающую допустимый ввод. Если вы введете идентификатор, который не был найден, вы получите уведомление о том, что он не был найден. В любом из последних двух случаев контроллер должен просто вернуть вас обратно на страницу, с которой вы пришли, и отобразить соответствующее флэш-сообщение.
Для начала вот поле поиска в представлении:
<%= 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.each do |key, value| %>
<div data-alert class="alert-box cbc-<%= key %>">
<%= value %>
<a href="#" class="close">×</a>
</div>
<% end %>
В Chrome и FireFox это работает точно так, как ожидалось. Вспышка появляется для одного запроса, затем исчезает. Тем не менее, в Safari, когда вспышка срабатывает, она никогда не исчезает для этой страницы. Так, например, если вы получили сообщение об ошибке на главной странице, вы можете обновить все, что хотите. Это остается на месте. Вы можете перейти на другую страницу, а затем вернуться, и она все еще там. То же самое верно и для других страниц. Как только флэш-сообщение появилось на данной странице, оно не исчезло.
Таким образом, мой вопрос: как я могу заставить Safari очистить флэш-память после первого запроса?
Мне известно о проблеме "flash vs. flash.now" при рендеринге страниц. Но даже тогда вспышка исчезнет, если вы просто обновите. Я на самом деле пробовал flash.now в этом случае, но тогда вспышка вообще не отображается ни в одном браузере.
Так как это похоже на проблему, связанную с браузером, вот некоторые дополнительные статистические данные в моей системе:
- Mac OS X 10.9
- Safari 7.0
- Рельсы 3.2.16
Одно последнее замечание. Поэкспериментировав с этой проблемой в Safari, я заметил, что если я нажму на мою закладку для http://localhost:3000/
, что бы очистить вспышку. Конечно, все навигационные ссылки в макете моего сайта содержат относительные пути, тогда как закладка вызывает полный URL-адрес.
Во всяком случае, надеюсь, что это имело смысл. Заранее спасибо за помощь!