how to display devise error messages when i'm putting the login in and sign up forms in same page

23,632

Solution 1

I found the solution to this problem on StackOverFlow some time ago. Here's what worked for me

# In application.html.erb
<% flash.each do |name, msg| %>

  # New code (allow for flash elements to be arrays)
  <% if msg.class == Array %>
    <% msg.each do |message| %>
      <%= content_tag :div, message, :id => "flash_#{name}" %>
    <% end %>
  <% else %>

    # old code
    <%= content_tag :div, msg, :id => "flash_#{name}" %>

  <% end %> #don't forget the extra end
<% end %>

and

# Wherever you want Devise's error messages to be handled like 
# your other error messages
# (in my case, registrations_controller.rb, a custom controller)
flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages

See original post here

...and think about accepting answer, 50% is a bit low! ;)

===== EDIT =====

If you need to redirect to another page when errors occurs, you'll have to override controllers (check Devise Wiki or search stackoverflow for howto) but it should look like something like that

# CUSTOM DEVISE CONTROLLER
class RegistrationsController < Devise::RegistrationsController

  # POST /resource
  def create
    build_resource

    if resource.save
      if resource.active_for_authentication?     
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_in(resource_name, resource)
        respond_with resource, :location => redirect_location(resource_name, resource)
      else
        set_flash_message :notice, :inactive_signed_up, :reason => resource.inactive_message.to_s if is_navigational_format?
        expire_session_data_after_sign_in!
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      end
    else
      clean_up_passwords(resource)
      # Solution for displaying Devise errors on the homepage found on:
      # https://stackoverflow.com/questions/4101641/rails-devise-handling-devise-error-messages
      flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages
      redirect_to root_path # HERE IS THE PATH YOU WANT TO CHANGE
    end
  end
end

Solution 2

Just add this code under devise->sessions->new.html.erb(View part)
  <%= devise_error_messages! %>
    <% flash.each do |key, value| %>
       <div class="flash <%= key %>"><%= value %></div>
    <% end %>

Solution 3

After a lot of searching, I found that the following worked pretty well for my purposes. Just create the Devise Helper and store the resource.errors.full_messages in a flash error container.

Specifically:

module DeviseHelper

  def devise_error_messages!
     flash[:error] = resource.errors.full_messages.first
  end
end

Solution 4

just a little thing to add:

Do not print the entire flash hash, print only specific keys. In some circumstances, Devise adds a :timedout key to the flash hash, which is not meant for display. Remove this key from the hash if you intend to print the entire hash.

Share:
23,632
gal
Author by

gal

Updated on August 15, 2022

Comments

  • gal
    gal over 1 year

    I'm using devise and I put the login and sign up forms in the same page, now when I write invalid login details or don't fill required input data at the sign up form.

    I'm redirecting to the /users page if I'm trying to register or to the /users/sign_in if I try to login with the errors i made...

    I want to stay in the same page and show the errors in the same page.

    how can I do it?

    thanks you very much, I need a quick help :)

  • gal
    gal almost 13 years
    don't working... when i click on login or register i'm stil redirecting to anthoer page and there i'm getting the errors...
  • Lucas
    Lucas almost 13 years
    You have to override your controllers and changes the response route. See my edit.
  • gal
    gal almost 13 years
    you forget to tell me to put in the routes: :registrations => "registrations"
  • smtlaissezfaire
    smtlaissezfaire about 7 years
    This works fine when signing up, but the user object doesn't have any errors when it is not found when logging in.