如何在设计中创建确认后重定向?
在我添加confirmation module
自定义after_sign_up_path
第一次工作正常之前,login/signup
但现在当我单击电子邮件中的确认链接时,它会重定向到我为登录后路径(用户配置文件)设置的路径。
我的目标是创建一个表单向导和“入门”页面来收集更多信息。明显的警告是,这种重定向只会发生一次,在确认后。
我尝试了一些其他已在 Stack Overflow 上发布的解决方案,但它们似乎都不再起作用了。
如何在设计中创建确认后重定向?
在我添加confirmation module
自定义after_sign_up_path
第一次工作正常之前,login/signup
但现在当我单击电子邮件中的确认链接时,它会重定向到我为登录后路径(用户配置文件)设置的路径。
我的目标是创建一个表单向导和“入门”页面来收集更多信息。明显的警告是,这种重定向只会发生一次,在确认后。
我尝试了一些其他已在 Stack Overflow 上发布的解决方案,但它们似乎都不再起作用了。
after_confirmation_path_for
实现此目的的一种不那么侵入性的方法可能只是覆盖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
在config/routes.rb
中,添加这一行,以便设计将使用您的自定义ConfirmationsController
。这假设设计在users
桌子上运行(您可以编辑以匹配您的)。
devise_for :users, controllers: { confirmations: 'confirmations' }
重新启动 Web 服务器,您应该拥有它。
你检查过设计维基吗?它解释了如何执行此操作,并after_signup_path_for
在您的案例中定义路径。
来自维基:
制作一个新的控制器“registrations_controller.rb”并自定义适当的方法:
class RegistrationsController < Devise::RegistrationsController protected def after_sign_up_path_for(resource) '/an/example/path' end end
然后添加一个路由来使用它:
修改 config/routes.rb 以使用新的控制器
devise_for :users, :controllers => { :registrations => "registrations" }
本质上,您想在Devise 的第 25 行ConfirmationsController
附近进行更改。
这意味着您需要覆盖将操作中该语句show
的“快乐路径”修改为您的内容的操作:if
show
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
方法,因此作为另一种选择,您可以只修改该方法返回的内容。
@Lee Smith 给出的解决方案运行良好,但我想补充一点:在这种情况下,我们不需要在覆盖设计确认控制器时添加new
and操作:create
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" }
我刚刚经历了所有这些,其他答案都没有奏效(2015-04-09 与设计 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
我刚刚发现了这条评论,它可以准确地将我送到我需要更快到达的地方。
这是对提到 Niels 的 after_inactive_sign_up_path_for 的引用:Devise wiki – marrossa 2012 年 11 月 13 日 3:38
在使用集成在 rails 应用程序中的炼油厂cms时,confirmation_path
还必须进行配置