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

时间:2015-02-17 18:31:34

标签: ruby-on-rails ruby devise

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

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

1 个答案:

答案 0 :(得分:9)

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

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

事实证明,Devise默认生成的内容(至少在我的应用程序中)是路由。 confirmation_url帮助,但您仍然可以看到路由设计生成:

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的路由的名称,但您可以从顶部的POST中推断出它;路线名为account_confirmation。所以现在我可以使用rails url helper自己生成url:

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

哪个会返回上面的网址。请务必将account替换为user,或者使用Devise进行身份验证的其他任何内容。