37

How can I make f.error_messages work here, or should I use flashes?
If so, what should override in the sessions_controller?

<h2>Create an account</h2>    
<% form_for resource_name, resource, :url => registration_path(resource_name) do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :email %><br />
    <%= f.text_field :email, :class => :big %>
  </p>
  <p>
    <%= f.label :password %><br />
    <%= f.password_field :password, :class => :big %>
  </p>
  <p>
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, :class => :big %>
  </p>

  <p><%= f.submit "Create", :class => :submit %></p>
<% end %>

PS. f.error_messages for Creating an account works totally fine.

Frexuz
  • 4,732
  • 2
  • 37
  • 54

6 Answers6

66

try putting these in your layout:

<%= content_tag(:div, flash[:error], :id => "flash_error") if flash[:error] %>
<%= content_tag(:div, flash[:notice], :id => "flash_notice") if flash[:notice] %>
<%= content_tag(:div, flash[:alert], :id => "flash_alert") if flash[:alert] %>

Login action in Devise sets flash messages, not model Errors.

ffoeg
  • 2,336
  • 1
  • 14
  • 13
  • 3
    Ok. :notice works fine after you login, but error/alert doesn't seem to get set at all.. – Frexuz Jan 10 '11 at 17:36
  • 3
    Why does it set flash messages instead of model errors? I would expect model errors given its failing validations. – pingu Sep 30 '13 at 18:15
  • 1
    You saved me ! Thank you – Léo Dec 16 '15 at 11:44
  • 2
    2016 and this works just like it did back in 2011. So the question here is this: if you place flash messages in your layout, how do you force them to appear between `

    Sign in

    ` and `
    ...
    ` on sign in page?
    – mzrnsh Jul 21 '16 at 21:02
33

Admittedly, a bit hacky, but I'm using this helper (app/helpers/devise_helper.rb) to grab flashes and use those if set then default to resource.errors.

module DeviseHelper

  def devise_error_messages!
    flash_alerts = []
    error_key = 'errors.messages.not_saved'

    if !flash.empty?
      flash_alerts.push(flash[:error]) if flash[:error]
      flash_alerts.push(flash[:alert]) if flash[:alert]
      flash_alerts.push(flash[:notice]) if flash[:notice]
      error_key = 'devise.failure.invalid'
    end

    return "" if resource.errors.empty? && flash_alerts.empty?
    errors = resource.errors.empty? ? flash_alerts : resource.errors.full_messages

    messages = errors.map { |msg| content_tag(:li, msg) }.join
    sentence = I18n.t(error_key, :count    => errors.count,
                                 :resource => resource.class.model_name.human.downcase)

    html = <<-HTML
    <div id="error_explanation">
      <h2>#{sentence}</h2>
      <ul>#{messages}</ul>
    </div>
    HTML

    html.html_safe
  end

end
typeoneerror
  • 55,990
  • 32
  • 132
  • 223
6

Despite the age of this post I wanted to share a solution to help people such as myself who had trouble when they began using Devise. To keep things DRY I just ended up inserting this code in my application.html.erb file:

<body>
  <% flash.each do |key, value| %>
    <div class="flash <%= key %>"><%= value %></div>
  <% end %>

  <%= yield %>
</body>
Carl Edwards
  • 13,826
  • 11
  • 57
  • 119
3

This shall also do

<% flash.each do |name, msg| %>
  <%= content_tag :div, msg, id: "flash_#{name}" %>
<% end %>
Sachin
  • 963
  • 11
  • 31
0

Create a helper

 # app/helpers/application_helper.rb

    module ApplicationHelper

      def flash_class(level)
        case level
          when 'info' then "alert alert-info"
          when 'notice','success' then "alert alert-success"
          when 'error' then "alert alert-danger"
          when 'alert' then "alert alert-warning"
        end
      end

    end

#view
<% flash.each do |key, value| %>
   <div class="<%= flash_class(key) %> fade in">
      <a href="#" class="close" data-dismiss="alert">&times;</a>
      <%= value %>
   </div>
<% end %>
gilcierweb
  • 2,598
  • 1
  • 16
  • 15
0

Easy. Just put the code below in views/devise/sessions/new.html.erb

<% if flash[:alert] %>
 <div class='alert alert-danger'><%= flash[:alert] %></div>
<% end %>

And That's it!

Elly Ambet
  • 478
  • 4
  • 13