Ruby-on-rails 设计 after_sign_in_path_for ... 发送到 .... root_path - 查询
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/8234023/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Devise after_sign_in_path_for ... sending to .... root_path - query
提问by Salman Ahmed
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 )
我需要有关设计身份验证 gem 的路由问题帮助,以便在成功登录后重定向到自定义页面,以便通过输入测试人员姓名和年龄(测试数据)来创建新记录
I am using Rails 3 with devise version 1.4.9
我正在使用 Rails 3 和设计版本 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
在我的 routes.rb 文件中,我有以下几行
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_pathor route /testers/newafter successful sign_inby user email and password.
虽然大部分代码是用脚手架完成的,但我仍然无法弄清楚如何在通过用户电子邮件和密码成功登录后重定向到new_tester_path或路由/testers/new。
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
回答by donnie rawlings
Just use this snippet:
只需使用此代码段:
class ApplicationController < ActionController::Base
def after_sign_in_path_for(user)
user_url(user)
end
end
回答by cthulhu
Try setting user_return_to path in session:
尝试在会话中设置 user_return_to 路径:
session['user_return_to'] = new_tester_path
You can do it in a controller derived from Devise::SessionsController
您可以在从 Devise::SessionsController 派生的控制器中执行此操作
回答by yellowaj
If you are having issues trying to override the after_sign_in_path_foror after_sign_out_path_forhelper methods within the ApplicationController of a Rails engine, you may want to check out this answer.
如果您在尝试覆盖Rails 引擎的 ApplicationController 中的after_sign_in_path_for或after_sign_out_path_for辅助方法时遇到问题,您可能需要查看此答案。
It describes how you'll need to override the SessionsController in your engine instead of the ApplicationController.
它描述了您需要如何覆盖引擎中的 SessionsController 而不是 ApplicationController。
回答by Fernando Kosh
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.
Devise 文档解释了成功登录后重定向到特定页面的所有步骤。通过结合这些技术,您可以在成功登录后将用户重定向到许多地方。
Here is the resume:
以下是简历:
You can do this in a controller you inherit from Devise::SessionsController - first, in controllers/users/sessions_controller.rb:
您可以在从 Devise::SessionsController 继承的控制器中执行此操作 - 首先,在 controller/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:
在 config/routes.rb 中,您还可以添加:
devise_for :users, controllers: {sessions: 'users/sessions'}
And you must add a custom after_sign_in_path_for in your ApplicationController
并且您必须在 ApplicationController 中添加自定义 after_sign_in_path_for
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.
据我所知,这适用于所有设计版本。
回答by zykadelic
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.
我相信这是一个继承问题。after_sign_in_path_for 最初是在 Devise::SessionsController 中定义的。您可以通过使 SessionsController 从 Devise::SessionsController 继承来覆盖它,然后在该控制器中重新定义它。
回答by Rodrigo Flores
You don't seem to be doing anything wrong. Maybe this is a Devise issue.
你似乎没有做错什么。也许这是一个设计问题。
Can you please try to isolate this on a Rails app and open an issue on Devise ?
您能否尝试在 Rails 应用程序上隔离它并在 Devise 上打开一个问题?

