43

如何在设计中创建确认后重定向?

在我添加confirmation module自定义after_sign_up_path第一次工作正常之前,login/signup但现在当我单击电子邮件中的确认链接时,它会重定向到我为登录后路径(用户配置文件)设置的路径。

我的目标是创建一个表单向导和“入门”页面来收集更多信息。明显的警告是,这种重定向只会发生一次,在确认后。

我尝试了一些其他已在 Stack Overflow 上发布的解决方案,但它们似乎都不再起作用了。

4

6 回答 6

138

after_confirmation_path_for实现此目的的一种不那么侵入性的方法可能只是覆盖Devise::ConfirmationsController.

confirmations_controller.rbapp/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 服务器,您应该拥有它。

于 2013-02-27T15:12:51.120 回答
19

你检查过设计维基吗?它解释了如何执行此操作,并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" }
于 2012-06-07T07:56:58.090 回答
19

本质上,您想在Devise 的第 25 行ConfirmationsController附近进行更改。

这意味着您需要覆盖将操作中该语句show的“快乐路径”修改为您的内容的操作:ifshow

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方法,因此作为另一种选择,您可以只修改该方法返回的内容。

于 2012-07-02T18:40:32.387 回答
3

@Lee Smith 给出的解决方案运行良好,但我想补充一点:在这种情况下,我们不需要在覆盖设计确认控制器时添加newand操作: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" }
于 2017-10-18T03:28:52.167 回答
2

我刚刚经历了所有这些,其他答案都没有奏效(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

于 2015-04-09T06:42:29.523 回答
-3

在使用集成在 rails 应用程序中的炼油厂cms时,confirmation_path还必须进行配置

于 2013-05-19T17:43:11.023 回答