如何在邮件之外使用Devise的`confirmation_url`?

kik*_*ito 6 ruby ruby-on-rails devise

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

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

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

在常规的Rails应用程序中,我可以Rails.application.routes.url_helpers用来生成网址(例如Rails.application.routes.url_helpers.user_path(@user)).

有什么类似我可以用来confirmation_url在邮件程序视图之外调用吗?

kik*_*ito 9

好吧,经过一段时间的斗争,我决定阅读这个文件顶部附近的解释:

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

事实证明,Devise默认生成的内容(至少在我的应用程序中)是路由.confirmation_url是一个帮手,但你仍然可以看到Devise生成的路线:

rake routes | grep confirm
Run Code Online (Sandbox Code Playgroud)

因为我使用的是一个名为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
Run Code Online (Sandbox Code Playgroud)

通过查看生成的电子邮件,我确认电子邮件看起来像这样:

http://myserver.com/accounts/confirm?confirmation_token=xxxx
Run Code Online (Sandbox Code Playgroud)

这是上面列出的第三条路线 - 第二条GET.由于我不知道的原因,rails不会打印类似show的路由的名称,但您可以从顶部的POST中推断出它; 路线命名account_confirmation.所以现在我可以使用rails url helper自己生成url:

Rails.application
     .routes.url_helpers
     .account_confirmation_url(confirmation_token: account.confirmation_token)
Run Code Online (Sandbox Code Playgroud)

这将返回如上所述的URL.记得替换accountuser,或者其他任何你与设计验证.