在Devise中自定义confirmation_url

如何在邮件程序视图中自定义Devise生成的默认行?

@resource.confirmation_token) %>

我在我的控制器中编写了一个名为user_confirm 。 我也为它定义了一条路线。 我可以使用令牌作为参数来获取链接到该方法的URL吗?

我用过这个路由:

 map.user_confirm 'confirm/:confirmation_token', :controller => 'confirmations', :action => 'show' 

这个ERB:

 <%= link_to 'Confirm my account', user_confirm_url(:confirmation_token => @resource.confirmation_token) %> 

得到了这个很好的链接:

 http://localhost:3000/confirm/RjOnrd5yNREEDwsEfiFa 

它的类似(在routes.rb中):

 devise_scope :user do match '/confirm/:confirmation_token', :to => "devise/confirmations#show", :as => "user_confirm", :only_path => false end 

在视图中,您可以使用以下内容:

 <%= link_to 'Confirm my account', user_confirm_url(@resource.confirmation_token) %> 

对于Rails 3。

  • rails 4.0.5
  • devise 3.2.4

之前

url:

 http://example.com/users/confirmation?confirmation_token=jevYKv1z9Pr1LsAUB2NX 

应用程序/视图/设计/邮件/ confirmation_instructions.html.erb:

 

<%= link_to 'Confirm my account', confirmation_url(@resource, confirmation_token: @token) %>

配置/ routes.rb文件:

 devise_scope :user do get 'confirm/:confirmation_token', to: 'devise/confirmations#show' end 

应用程序/视图/设计/邮件/ confirmation_instructions.html.erb:

 

<%= link_to 'Confirm my acount', confirm_url(@token) %>

url:

 http://example.com/confirm/Kezap1iutgvXyQAhyu64 

得到它了。 让我说我像这样定义我命名的路线。

 map.user_confirm '/user_confirm', :controller => 'users', :action => 'confirm' 

我所要做的就是

 

<%= link_to 'Confirm my account', user_confirm_url(confirmation_token => @resource.confirmation_token) %>

自定义设计URL不会udpate用户表的’confirmed_at’列,您可以执行的操作是在单击确认链接后重定向用户:

STEP 1覆盖confirmmations_controller中的after_confirmation_path_for:

在app / controllers目录中创建一个新的confirmations_controller.rb:

 class ConfirmationsController < Devise::ConfirmationsController private def after_confirmation_path_for(resource_name, resource) your_new_after_confirmation_path end end 

步骤2在config / routes.rb中,添加此行,以便Devise将使用您的自定义ConfirmationsController。 这假设Devise在用户表上运行(您可以编辑以匹配您的用户)。

 devise_for :users, controllers: { confirmations: 'confirmations' } 

步骤3重新启动Web服务器