Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 270
Jackson Cunningham Avatar asked Feb 02 '17 21:02

Jackson Cunningham


1 Answers

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" }
like image 125
Shannon Avatar answered Oct 25 '22 23:10

Shannon