Devise after_sign_in_path_for ... sending to .... root_path - query
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.
Salman Ahmed
Updated on July 09, 2022Comments
-
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