确认后设计重定向

时间:2012-06-07 06:20:19

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1

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

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

我的目标是创建表单向导和“入门”页面以收集其他信息。显而易见的警告是,这种重定向只会在确认后发生一次。

我已经尝试过其他一些已经发布在堆栈上的解决方案,但它们似乎都不再有用了......

6 个答案:

答案 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的这一行:

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L25

所以这意味着你需要覆盖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