gal gal - 6 months ago 133
Ruby Question

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

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 :)

Answer

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:
      # http://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