Devise after_sign_in_path_for ... sending to .... root_path - query

26,041

Solution 1

Just use this snippet:

class ApplicationController < ActionController::Base
    def after_sign_in_path_for(user)
        user_url(user)
    end
end

Solution 2

Try setting user_return_to path in session:

session['user_return_to'] = new_tester_path

You can do it in a controller derived from Devise::SessionsController

Solution 3

The Devise documentation explains all the steps to redirect to a specific page on successful sign in. By combine the techniques, you can redirect a user to many places after successful sign in.

Here is the resume:

You can do this in a controller you inherit from Devise::SessionsController - first, in controllers/users/sessions_controller.rb:

module Users
  class SessionsController < Devise::SessionsController
   def new
     if params[:redirect_to].present?
       self.resource = resource_class.new(sign_in_params)
       store_location_for(resource, params[:redirect_to])  
     end
     super
   end
  end
end

In config/routes.rb, you would have also added:

devise_for :users, controllers: {sessions: 'users/sessions'}

And you must add a custom after_sign_in_path_for in your ApplicationController

class ApplicationController < ActionController::Base
  protected
  def after_sign_in_path_for(resource)
    stored_location_for(resource) || root_path
  end
end

This works in all Devise versions, as I know.

Solution 4

If you are having issues trying to override the after_sign_in_path_for or after_sign_out_path_for helper methods within the ApplicationController of a Rails engine, you may want to check out this answer.

It describes how you'll need to override the SessionsController in your engine instead of the ApplicationController.

Solution 5

I believe this is an inheritance issue. after_sign_in_path_for is originally defined within Devise::SessionsController. You can override it by making your SessionsController inherit from Devise::SessionsController, and then re-defining it within that controller.

Share:
26,041
Salman Ahmed
Author by

Salman Ahmed

Updated on July 09, 2022

Comments

  • Salman Ahmed
    Salman Ahmed almost 2 years

    I need help with a routes issue with devise authentication gem to redirect to a custom page after successful login so as to create a new record by entering a test person name and age ( test data )

    I am using Rails 3 with devise version 1.4.9

    My routes are as below

        new_user_session GET    /users/sign_in(.:format)       {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)       {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session DELETE /users/sign_out(.:format)      {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)      {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)  {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)      {:action=>"update", :controller=>"devise/passwords"}
       cancel_user_registration GET    /users/cancel(.:format)        {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)               {:action=>"create", :controller=>"devise/registrations"}
       new_user_registration GET    /users/sign_up(.:format)       {:action=>"new", :controller=>"devise/registrations"}
       edit_user_registration GET    /users/edit(.:format)          {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)               {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)               {:action=>"destroy", :controller=>"devise/registrations"}
                 testers GET    /testers(.:format)             {:action=>"index", :controller=>"testers"}
                         POST   /testers(.:format)             {:action=>"create", :controller=>"testers"}
              new_tester GET    /testers/new(.:format)         {:action=>"new", :controller=>"testers"}
             edit_tester GET    /testers/:id/edit(.:format)    {:action=>"edit", :controller=>"testers"}
                  tester GET    /testers/:id(.:format)         {:action=>"show", :controller=>"testers"}
                         PUT    /testers/:id(.:format)         {:action=>"update", :controller=>"testers"}
                         DELETE /testers/:id(.:format)         {:action=>"destroy", :controller=>"testers"}
                    root        /                              {:controller=>"testers", :action=>"index"}
    

    In applications controller i tried to override the method like below but to no avail i still get routed back to tester index

    class ApplicationController < ActionController::Base
    
      protect_from_forgery
    
      def after_sign_in_path_for(resource) 
    
          new_tester_path
    
      end
    
    end
    

    In my routes.rb file i have the below lines

    Testing::Application.routes.draw do
    
      devise_for :users 
    
      resources :testers
    
      root :to => 'testers#index'
    

    While much of the code was done with scaffolding I was still not be able to figure how to redirect to new_tester_path or route /testers/new after successful sign_in by user email and password.

    Can someone please let me know what i am missing..... while writing the override function, I would like to know the exact route i need to specify.

    While testing i tried something stupid like this but the google page is also not opening ... :(

    class ApplicationController < ActionController::Base 
    
    protect_from_forgery 
    
    helper ApplicationHelper
    
    def after_sign_in_path_for(resource) 
    
    "www.google.com" 
    
    end 
    
    def after_sign_up_path_for(resource) 
    
    "www.google.com" 
    
    end 
    
    def after_update_path_for(resource) 
    
    "www.google.com" 
    
    end