Monday, February 13, 2017

Rails & Devise: Failed registration attempt redirects to root url

Leave a Comment

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?

1 Answers

Answers 1

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" } 
If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment