gal gal - 1 year ago 206
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

page if I'm trying to register or to the
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 Source

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 %>


# 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

class RegistrationsController < Devise::RegistrationsController

  # POST /resource
  def create

      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)
        set_flash_message :notice, :inactive_signed_up, :reason => resource.inactive_message.to_s if is_navigational_format?
        respond_with resource, :location => after_inactive_sign_up_path_for(resource)
      # Solution for displaying Devise errors on the homepage found on:
      flash[:notice] = flash[:notice].to_a.concat resource.errors.full_messages
      redirect_to root_path # HERE IS THE PATH YOU WANT TO CHANGE