我在rails项目中使用Devise。我想将确认网址传递给第三方。该url由以下Devise Mailer视图中的表达式confirmation_url(@resource, confirmation_token: @token)
生成:
我已经找到了Devise的整个源代码,试图找出confirmation_url
定义的是谁或哪里,但我找不到任何东西;它只出现在视图上,因此它必须由某些东西动态生成。
在常规的Rails应用中,我可以使用Rails.application.routes.url_helpers
来生成网址(例如Rails.application.routes.url_helpers.user_path(@user)
)。
在邮件程序视图之外是否可以使用任何类似的方法来调用confirmation_url
?
答案 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进行身份验证的其他任何内容。