覆盖 Devise 的注册控制器以允许在成功注册后进行重定向 [英] Overriding Devise's registration controller to allow for a redirect after a successful sign_up has been done
问题描述
我找遍了整个地方,找到了很多信息……但对我来说没有任何用处,我不明白:(
I have looked all over the place, and found a lot of info... but nothing works for me and I don't get it :(
我知道您应该覆盖注册控制器,如下所示:
I know that you are suppose to override the registration controller, like this:
class Users::RegistrationsController < Devise::RegistrationsController
def after_sign_up_path_for(resource)
authors_waiting_path
end
end
然后按照 Tony Amoyal 展示的例子 http://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-and-cancan-customizing-devise-controllers/,我应该更改我的路线以更新对新控制器的访问:
Then following the example showed by Tony Amoyal http://www.tonyamoyal.com/2010/07/28/rails-authentication-with-devise-and-cancan-customizing-devise-controllers/, I am supposed to change my routes to update the access the new controller:
devise_for :users, :controllers => { :registrations => "users/registrations" } do
#get '/author/sign_up', :to => 'devise/registrations#new'
#get '/client/sign_up', :to => 'devise/registrations#new'
get '/author/sign_up', :to => 'users/registrations#new'
get '/client/sign_up', :to => 'users/registrations#new'
end
是的,我在这里有点奇怪,因为我正在捕捉一些特定的路径将它们发送到注册页面,这使我能够有效地创建 2 个注册场景.我评论了我覆盖注册控制器之前的内容.
Yes, I have something a bit strange here, because I am catching some specific path to send them to the registration page, this allows me to create effectively 2 registration scenario. I commented what I had before I had overridden the registration controller.
即使所有这些以及我的authors_waiting_path 是一个有效路径,它也会在注册后继续进入登录页面:(
Even with all this and my authors_waiting_path being a valid path, it just keeps on going to the sign-in page after registration :(
这真的很令人沮丧.
亚历克斯
我也在设计维基上找到了这个:https://github.com/plataformatec/devise/wiki/How-To:-Redirect-after-registration-(注册)
edit: I also found this on the devise wiki: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-after-registration-(sign-up)
但我不知道在哪里定义这个创建方法?我应该覆盖会话控制器吗???
But I have no idea where to define this create method ? should I override the session controller ???
编辑 2:
我对控制器进行了虚拟覆盖:
I put a dummy override of the controller:
class Pouets::RegistrationsController < Devise::RegistrationsController
def after_sign_up_path_for(resource)
authors_waiting_path
end
def new
super
end
def create
puts "was here"
super
end
def edit
super
end
def update
super
end
def destroy
super
end
def cancel
super
end
end
而且我从来没有在我的日志中出现过在这里"......我真的觉得它完全忽略了覆盖......我一定是做错了什么:(
And I never the "was here" in my logs.... I really have the feeling that it's totally ignoring the override... I must be doing something wrong :(
推荐答案
好的...我可以覆盖它,所以你应该是 :0
Ok... I am able to override it so you should be either :0
创建文件夹 app/controllers/users
Create folder app/controllers/users
把 registrations_controller.rb 放在那里:(带有会话的选项 - 但它会尝试 sign_in 并稍后重定向 - 它可能不是你的预期行为).此外,这是来自设计维基,我不确定它是否有效
put there registrations_controller.rb with: (option with session - but it will try sign_in and later redirect - it may be not intended behavior for you ). Furthermore this is from devise wiki and I am not sure if it works
class Users::RegistrationsController < Devise::RegistrationsController
def create
session["#{resource_name}_return_to"] = complete_path
super
end
end
重启应用程序(只是为了确保你不信任任何东西)
restart application (just for ensure you don't trust anything)
总而言之,你必须覆盖 Create 如果你只想重定向用户...如果你想定义一些更复杂的场景,你应该monkeypatch sign_in_and_redirect
All in all you must override Create If you want redirect only Users... if you want define some more complex scenario you should monkeypatch sign_in_and_redirect
所以你的控制器看起来像
so your controller will looks like
class Users::RegistrationsController < Devise::RegistrationsController
# POST /resource/sign_up
def create
build_resource
if resource.save
set_flash_message :notice, :signed_up
#sign_in_and_redirect(resource_name, resource)
#this commented line is responsible for sign in and redirection
#change to something you want..
else
clean_up_passwords(resource)
render_with_scope :new
end
end
end
第二个选项尝试使用monkeypatch helper ....
second option try to monkeypatch helper ....
module Devise
module Controllers
# Those helpers are convenience methods added to ApplicationController.
module Helpers
def sign_in_and_redirect(resource_or_scope, resource=nil, skip=false)
#intended behaviour for signups
end
end
end
end
这篇关于覆盖 Devise 的注册控制器以允许在成功注册后进行重定向的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!