Search code examples
ruby-on-railsdevise

Rails & Devise: Failed registration attempt redirects to root url


When a user has a failed registration attempt, my app is redirecting them to the root url instead of rendering the registration page.

Routes:

resources :users
  devise_for :users, path: '', path_names: { sign_up: 'register', sign_in: 'login', sign_out: 'logout'}, :controllers => { :omniauth_callbacks => "callbacks" }

registrations#new:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), :html => {:class => "col s12 form-text", autocomplete: "off"}) do |f| %>

  <%# render 'devise/errors', resource: resource %>
  <div class="row">
    <div class="input-field col s12">
      <%= f.text_field :full_name, :class => "validate", :required => true, :placeholder => "Robin Smith" %>

      <%# f.label :full_name, :class => "allcaps active", :data => {:error => 'Name Required'} %>
      <%= f.label :full_name, :class => "allcaps" %>
    </div>
  </div>

  <div class="row">
    <div class="input-field col s12">
      <%= f.email_field :email, :class => "validate", :required => true, placeholder: " " %>
      <%= f.label :email, :class => "allcaps" %>
    </div>
  </div>

  <div class="row">
    <div class="input-field col s12">
      <%= f.password_field :password, :class => "validate", :required => true, placeholder: " " %>
      <%= f.label :password, "password (min 6 chars)", :class => "allcaps" %>
    </div>
  </div>

  <div class="button-container">
    <button class="waves-effect btn-flat btn-large"type="submit" name="action">Join Now</button>
  </div>
<% end %>

I can go to mydomain.com/register and the form appears. But when there's a failed registration attempt, they're redirected to the root url instead of re-rendering the register page with errors.

I feel like there must be something wrong in my routes. Any idea?


Solution

  • You can override the Devise create action and redirect to your url:

    # registrations_controller.rb
    class RegistrationsController < Devise::RegistrationsController
    
      def create
        build_resource(sign_up_params)
    
        resource.save
        yield resource if block_given?
        if resource.persisted?
          if resource.active_for_authentication?
            set_flash_message! :notice, :signed_up
            sign_up(resource_name, resource)
            respond_with resource, location: after_sign_up_path_for(resource)
          else
            set_flash_message! :notice, :"signed_up_but_#{resource.inactive_message}"
            expire_data_after_sign_in!
            respond_with resource, location: after_inactive_sign_up_path_for(resource)
          end
       else
         clean_up_passwords resource
         set_minimum_password_length
         resource.errors.full_messages.each {|x| flash[x] = x}
         #redirect_to your_path
       end
      end
    
    end 
    

    And in routes:

    resources :users
      devise_for :users, path: '', path_names: { sign_up: 'register', sign_in: 'login', sign_out: 'logout'}, :controllers => { :registrations => "registrations", :omniauth_callbacks => "callbacks" }