如何在邮件程序之外使用 Devise 的“confirmation_url”?

How can I use Devise's `confirmation_url` outside of a mailer?

我在 rails 项目中使用 Devise。我想将确认 url 传递给第三方。 url 由以下 Devise Mailer 视图中的表达式 confirmation_url(@resource, confirmation_token: @token) 生成:

https://github.com/plataformatec/devise/blob/master/app/views/devise/mailer/confirmation_instructions.html.erb

我已经 grep 了 Devise 的整个源代码,试图找出 confirmation_url 定义的人或位置,但我找不到任何东西;它只出现在视图中,因此它必须由某些东西动态生成。

在常规 Rails 应用程序中,我可以使用 Rails.application.routes.url_helpers 生成 url(例如 Rails.application.routes.url_helpers.user_path(@user))。

是否有类似的东西可以用来在邮件视图之外调用 confirmation_url

好吧,在纠结了一段时间之后,我决定阅读这个文件顶部附近的解释:

https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/url_helpers.rb

事实证明,Devise 默认生成的(至少在我的应用程序上)是路由。 confirmation_url 是一个 helper,但你仍然可以看到 routes Devise 生成:

rake routes | grep confirm

因为我使用的是 Account 而不是 User 的模型,这给了我这个:

account_confirmation     POST /accounts/confirmation(.:format)  accounts/confirmations#create
new_account_confirmation GET  /accounts/confirmation/new(.:format) accounts/confirmations#new
                         GET  /accounts/confirmation(.:format)                         accounts/confirmations#show
confirm_account        PATCH  /accounts/confirmation(.:format)                         accounts/confirmations#update

通过查看生成的电子邮件,我确认电子邮件如下所示:

http://myserver.com/accounts/confirm?confirmation_token=xxxx

这是上面列表中的第三条路由 - 第二个 GET。由于我不知道的原因,rails 不会打印类似 show-like 的路由的名称,但您可以从顶部的 POST 推断出来;该路线名为 account_confirmation。所以现在我可以使用 rails url 帮助程序自己生成 url:

Rails.application
     .routes.url_helpers
     .account_confirmation_url(confirmation_token: account.confirmation_token)

这将 return 和上面的 url 一样。请记住将 account 替换为 user 或您使用 Devise 进行身份验证的任何其他内容。