I have a Rails 3.2 app that manages students. It has a fairly typical nav
bar across the top (Foundation 5) which contains a quick search field. The
nav bar is displayed on every page of the site.
If you enter a valid (numeric) student ID into the search field, you simply
jump to that student's page. If you enter text or other non-numeric input,
you get a flash error asking for valid input. If you enter an id that's not
found, you get a flash notice saying it wasn't found. In either of the
latter two cases, the controller should just drop you back to whatever page
you came from and display the appropriate flash message.
For starters, here's the search field in the view:
<%= 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 %>
And here's the controller action:
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
Lastly, here's the code for rendering flash messages in
application.html.erb:
<% flash.each do |key, value| %>
<div data-alert class="alert-box cbc-<%= key %>">
<%= value %>
<a href="#" class="close">×</a>
</div><% end %>
In Chrome and FireFox this works exactly as expected. The flash appears for
one request, then disappears. However, in Safari, once the flash comes up
it never goes away for that page. So if you get the error flash on the home
page, for example, you can refresh all you want. It stays put. You can go
to another page, and then come back, and it's still there. The same is true
for other pages. Once the flash message has appeared on a given page, it
doesn't go away.
*Thus my question: how can I get Safari to clear the flash after the first
request?*
I'm aware of the whole "flash vs. flash.now" issue when rendering pages.
But even then, the flash will disappear if you simply refresh. I actually
tried flash.now in this case, but then the flash isn't displayed at all in
any browser.
Since this appears to be a browser-specific problem, here are some further
stats on my system:
- Mac OS X 10.9
- Safari 7.0
- Rails 3.2.16
One final observation. After playing around with this issue in Safari, I
noticed that if I clicked my bookmark for http://localhost:3000/, that
would clear the flash. Of course, all the navigation links in my site
layout contain relative paths, whereas the bookmark is calling a full url.
Anyway, hope that made sense. Thanks in advance for your help!
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rubyonrails-talk/bf91d791-4ef0-477c-a4be-f05ff385a40c%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.