im using twitters bootstrap alert messages. in my application.html.erb I have...
<% flash.each do |key, value| %>
This is how i do it
<% flash.each do |key, value| %>
<div class="message">
<div class="alert-message <%= key %> fade in">
<a class="close" href="#">×</a>
<center><strong><%= value %></strong></center>
</div>
</div>
<% end %>
Thing is that devise_error_messages!
by itself wraps the data into div with class='alert'
, so the form will have 2 nested divs with the same class. Pressing the x
button will close nested div, leaving empty div styled as alert
. To avoid this you can omit the div inside helper return value as following:
module DeviseHelper
def devise_error_messages!
return '' if resource.errors.empty?
messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join
html = <<-HTML
<button type="button" class="close" data-dismiss="alert">x</button>
#{messages}
HTML
html.html_safe
end
end
The simplest solution I've found is to use a common partial for all flash messages while checking for :notice
and :alert
to replace with the necessary bootstrap class.
So make /views/shared/_alerts.html.erb
like this -
<% flash.each do |message_type, message| %>
<div class="alert alert-<%= flash_class_name(message_type) %> alert-dismissable">
<span><%= message %></span>
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<% end %>
Add a helper method (I've added it to the application helper) like this -
def flash_class_name(name)
case name
when "notice" then "success"
when "alert" then "danger"
else name
end
end
Include _alerts.html.erb
in the application layout (or the parent layout for your application).
That's it!
/app/helpers/devise_helper.rb
module DeviseHelper def devise_error_messages! return '' if resource.errors.empty? messages = resource.errors.full_messages.map { |msg| content_tag(:li, msg) }.join sentence = I18n.t('errors.messages.not_saved', count: resource.errors.count, resource: resource.class.model_name.human.downcase) html = <<-HTML <div class="alert alert-error alert-block"> <button type="button" class="close" data-dismiss="alert">x</button> <h4>#{sentence}</h4> #{messages} </div> HTML html.html_safe end end