how to customize devise error messages with classes

后端 未结 4 662
温柔的废话
温柔的废话 2021-02-08 16:06

im using twitters bootstrap alert messages. in my application.html.erb I have...

            <% flash.each do |key, value| %>
                
相关标签:
4条回答
  • 2021-02-08 16:29

    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="#">&times</a>
        <center><strong><%= value %></strong></center>
      </div>
    </div>
    <% end %>
    
    0 讨论(0)
  • 2021-02-08 16:33

    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
    
    0 讨论(0)
  • 2021-02-08 16:36

    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">&times;</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!

    0 讨论(0)
  • 2021-02-08 16:46

    For anyone coming across this that does not know how to override the devise error messages with bootstrap.

    1. Create file named:

    /app/helpers/devise_helper.rb

    1. Add the following code:
    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
    
    0 讨论(0)
提交回复
热议问题