如何在设计中创建确认后重定向?
在我添加confirmation module
之前,自定义after_sign_up_path
首次正常工作login/signup
但现在当我点击电子邮件中的确认链接时,它会重定向到我为其设置的路径登录路径后(用户配置文件)。
我的目标是创建表单向导和“入门”页面以收集其他信息。显而易见的警告是,这种重定向只会在确认后发生一次。
我已经尝试过其他一些已经发布在堆栈上的解决方案,但它们似乎都不再有用了......
答案 0 :(得分:126)
实现这一目标的一种较少侵入性的方法可能只是覆盖after_confirmation_path_for
的{{1}}方法。
在Devise::ConfirmationsController
目录中创建一个新的confirmations_controller.rb
:
app/controllers
在class ConfirmationsController < Devise::ConfirmationsController
private
def after_confirmation_path_for(resource_name, resource)
your_new_after_confirmation_path
end
end
中,添加此行,以便Devise将使用您的自定义config/routes.rb
。假设Devise在ConfirmationsController
表上运行(您可以编辑以匹配您的表)。
users
重新启动网络服务器,你应该拥有它。
答案 1 :(得分:19)
您检查了Devise wiki吗?它解释了如何执行此操作,after_signup_path_for
是您的案例中定义的路径。
来自维基:
创建一个新的控制器RegistrationsController:
class RegistrationsController < Devise::RegistrationsController
protected
def after_sign_up_path_for(resource)
'/an/example/path'
end
end
并添加使用它的路线:
devise_for :users, :controllers => { :registrations => "registrations" }
答案 2 :(得分:19)
基本上,您想要更改Devise ConfirmationsController的这一行:
所以这意味着你需要覆盖show动作。只需将show动作中“if”语句的快乐路径修改为您心中的内容:
class ConfirmationsController < Devise::ConfirmationsController
def new
super
end
def create
super
end
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_navigational_format?
sign_in(resource_name, resource)
respond_with_navigational(resource){ redirect_to confirmation_getting_started_path }
else
respond_with_navigational(resource.errors, :status => :unprocessable_entity){ render_with_scope :new }
end
end
end
它的一个范围路线(我把视图和动作放在注册控制器中但你可以把它改成什么):
devise_for :users, controllers: { confirmations: 'confirmations' }
devise_scope :user do
get '/confirmation-getting-started' => 'registrations#getting_started', as: 'confirmation_getting_started'
end
默认的show动作是指受保护的after_confirmation_path_for
方法,因此作为另一个选项,您可以修改该方法返回的内容。
答案 3 :(得分:2)
我只是通过所有这些并且没有其他答案奏效(2015-04-09 with devise 3.4.1)。
我想要的是在注册后,用户被重定向到登录页面,并显示有关确认电子邮件的消息。为了实现这一目标,我需要做的就是:
class RegistrationsController < Devise::RegistrationsController
protected
# This is the method that is needed to control the after_sign_up_path
# when using confirmable.
def after_inactive_sign_up_path_for(resource)
new_user_session_path
end
end
编辑: 我刚刚在下面发现这条评论,这些评论本可以让我更快地发送到我需要的地方。
这是对after_inactive_sign_up_path_for的引用 Niels提到:Devise wiki - 11月13日的marrossa和3点38分的
答案 4 :(得分:2)
@Lee Smith给出的解决方案工作得很好但是我希望添加一些补充,即我们不需要在覆盖Devise的同时添加新的和创建动作确认本案的控制人。
喜欢:
class ConfirmationsController < Devise::ConfirmationsController
def show
self.resource = resource_class.confirm_by_token(params[:confirmation_token])
if resource.errors.empty?
set_flash_message(:notice, :confirmed) if is_navigational_format?
sign_in(resource_name, resource)
respond_with_navigational(resource){ redirect_to your_desired_redirect_path }
else
respond_with_navigational(resource.errors, status: :unprocessable_entity){ render_with_scope :new }
end
end
end
然后在路径文件中,只需为确认控制器添加路由。
devise_for :users, controllers: { confirmations: "confirmations" }
答案 5 :(得分:-2)
使用集成在rails应用中的 refinerycms 时,还必须配置confirmation_path