【问题标题】:rails mailer generating invalid URLrails mailer 生成无效的 URL
【发布时间】:2012-10-11 20:40:00
【问题描述】:

我正在尝试使用 action mailer 将密码重置功能添加到我的 rails 应用程序。除了生成的重置密码链接不正确外,一切似乎都运行良好。

这里是文件:

File user_mailer.rb:

class UserMailer < ActionMailer::Base
  default from: "from@example.com"
  def password_reset(user)
    @user = user #make the user available in mailer template
    mail :to => user.email, :subject => "Password Reset"
  end
end

File password_reset.text.erb 包含以下链接:

&lt;%= edit_password_resets_url(@user.password_reset_token) %&gt;

当我获得电子邮件和令牌值时,我可以看到用户变量已正确传递。但是,邮件程序中生成的 URL 如下所示:

http://localhost:3000/password_reset/edit.jo_jYhkjsdjskjdskYHJSDA

但是,期望值是这样的

http://localhost:3000/password_resets/jo_jYhkjsdjskjdskYHJSDA/edit

routes.rb中有以下内容

resource :password_resets

另外,rake 路由显示如下:

edit_password_resets GET /password_resets(.:format) password_resets#edit

可能出了什么问题?

注意:我正在关注 Ryan bates 的 rails casts #274

【问题讨论】:

  • 在 routes.rb 中包含 resource :password_resets。也更新问题
  • 将其更改为resources :password_resets 会发生什么? (请参阅路由指南中的Singular resources。)另外,请注意Devise 几乎是“用户需要身份验证”问题的标准解决方案。
  • 像你这样的宁静路线需要一个 id,而不是一个令牌
  • @willglynn,这似乎是问题所在,当我更新到resources 时,它开始显示我以错误方式更改的其他问题。修复它们。最终想开始设计,但才刚刚开始,因此想在加入插件之前先练习一下..
  • willglynn,这是问题并已修复。请将其发布为答案并将接受。 @apneadiving,这是真的,在这种情况下,这被视为 id

标签: ruby-on-rails actionmailer rails-routing railscasts


【解决方案1】:

这似乎是 config/routes.rb 包含 resource :password_resets 而不是 resources :password_resets。作为singular resource,这会将edit_password_resets 路由添加到/password_resets/edit(.:format)。将值传递给 edit_password_resets_url 将映射到 edit.&lt;value&gt;,这与您描述的症状一致。

将其更改为 resources :password_resets 应该可以解决此问题。它还将路由重命名为edit_password_reset——单数,因为它适用于成员,而不是适用于集合的复数。

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 2019-04-06
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多