【问题标题】:Route for mailer link邮件链接的路由
【发布时间】:2015-06-03 11:17:31
【问题描述】:

帐户激活

我用来激活账号的路由和邮件链接如下:

# Route:
resources :account_activations, only: [:edit]

# Link in mailer:    
<%= edit_account_activation_url(@user.activation_token, email: @user.email) %>

链接会生成一个链接,例如http://www.example.com/account_activations/q5lt38hQDc_959PVoo6b7A/edit?email=foo%40example.com。控制器方法使用电子邮件地址来查找用户。

更新电子邮件地址的类似方法

现在,如果用户更改其电子邮件地址,我想用确认链接做类似的事情。我已经设置了各种控制器和模型方法,但我认为邮件程序中的链接和路由出现问题。我有:

# Route (should be the same as edit route above, but now for update_email):
get 'account_activations/update_email/:email' => 'account_activations#update_email', as: 'update_email'

# Link in mailer:
<%= update_email_url(@user.activation_token, email: @user.email) %>

问题:

该链接应根据用户的电子邮件地址识别用户(就像帐户激活一样)并生成一个链接,例如:http://www.example.com/account_activations/q5lt38hQDc_959PVoo6b7A/update_email?email=foo%40example.com。然而,它现在会生成一个链接,例如http://www.example.com/account_activations/update_email/foo@example.com

我认为这是错误的路线,但我不确定如何“模仿”我用于帐户激活的编辑路线。

尝试过的替代路线:

  • get 'account_activations/update_email/:id' =&gt; 'account_activations#update_email', as: 'update_email'。在这里我收到一条错误消息 missing required keys: [:id]
  • get 'account_activations/update_email' =&gt; 'account_activations#update_email', as: 'update_email'。在这里,我得到了一个链接,例如http://www.example.com/account_activations/update_email?email=foo%40example.com。因此,链接中再次缺少令牌。
  • resources :account_activations, only: :update。并将链接更改为&lt;%= account_activation_url(@user.activation_token, email: @user.email) %&gt;(当然还要更改控制器中的方法名称)。这会产生错误消息No route matches {:action=&gt;"update", :controller=&gt;"account_activations", :email=&gt;"example@example.com", :id=&gt;nil} missing required keys: [:id]
  • get 'account_activations/:token/update_email' =&gt; 'account_activations#update_email', as: 'update_email'。这产生了错误missing required keys: [:token]

更新:

如果我使用路线:

get 'account_activations/:id/update_email' => 'account_activations#update_email', as: 'update_email'

根据rake routes,两者似乎相似:

edit_account_activation GET    /account_activations/:id/edit(.:format)         account_activations#edit
           update_email GET    /account_activations/:id/update_email(.:format) account_activations#update_email

在我看来,我的情况与“帐户激活”相同。但是,虽然这适用于“帐户激活”,但对于更新电子邮件,当邮寄者应该发送链接时,它会产生错误:

No route matches {:action=>"update_email", :controller=>"account_activations", :email=>"example@example.com", :id=>nil} missing required keys: [:id]

【问题讨论】:

  • resources :account_activations, only: [:update] 有什么问题?
  • 虽然我的情况并非如此,但我可以想象有人可能已经将update 用于其他用途。但由于我的情况并非如此,所以我尝试了它(作为第 3 次尝试添加到原始帖子中)。也可能是更新不生成 GET 路由的问题。
  • 试试这条路线get 'account_activations/:token/update_email' =&gt; 'account_activations#update_email', as: 'update_email'
  • 这会产生错误missing required keys: [:token]。令牌应该以params[:id] 的形式提供,即railstutorial(我在帐户激活链接中关注)写道:“令牌将在 params 哈希中以 params[:id] 的形式提供。”,这可能就是为什么我在原帖中提到的第一个替代方案最有意义。
  • 为了您的更新,试试这个get '/account_activations/:id/update_email' =&gt; 'account_activations#update_email', as: 'update_email'

标签: ruby-on-rails ruby ruby-on-rails-4 routes railstutorial.org


【解决方案1】:

get 'account_activations/update_email/:id' =&gt; 'account_activations#update_email', as: 'update_email'。在这里,我收到一条错误消息,提示缺少必需的键:[:id]。

您收到此错误是因为在您的 config/routes.rb 文件中,您说的是get 'account_activations/update_email/:id,这使得每当您触发此路由时都必须发送id。而当您不发送id 时,您将收到错误消息。

get 'account_activations/update_email' =&gt; 'account_activations#update_email', as: 'update_email'. 在这里我得到了一个链接,例如 http://www.example.com/account_activations/update_email?email=foo%40example.com. 所以链接中又缺少令牌。

如果您真的想要将令牌与请求一起发送,您必须在 get 'account_activations/update_email' 中提及它,例如 get 'account_activations/update_email/:token',这样 - 它会附加 URL。

resources :account_activations, only: :update。并将链接更改为&lt;%= account_activation_url(@user.activation_token, email: @user.email) %&gt;(当然还要更改控制器中的方法名称)。这会产生错误消息:

没有路由匹配 {:action=>"update", :controller=>"account_activations", :email=>"example@example.com", :id=>nil} 缺少必需的键:[:id]。

嗯,这就是我在评论中向您解释的内容。 update 方法确实需要您尝试更新的模型的 id。没有id,它将无法工作。

所以,最后 - 我建议的解决方案是:使用 get 路由创建一个自定义方法,并发送令牌和附有 URL 的 id

【讨论】:

  • 我相信params[:id] 不是指用户的ID,而是指代币。 Railstutorial(我用于帐户激活链接)写道:“令牌将在 params 哈希中作为 params[:id] 可用。”。最后,我想对update_email 做同样的事情,就像我对“帐户激活”所做的那样,目前我不明白为什么我正在做的是用于帐户激活而不是用于更新电子邮件地址。我看到的唯一区别是路线,为什么在我看来一定有原因
  • 作者说,as params[:id]。如果您写get 'account_activations/:token/update_email',那么您只能通过params[:token] 访问它。要通过params[:id]访问,需要访问doget 'account_activations/:id/update_email'
  • 是的,我认为这就是我正在寻找的路线(在 OP 末尾添加)。不幸的是,它仍然会产生错误“缺少必需的键:[:id]”。真的很奇怪,因为它适用于“帐户激活”,我看不出我为 update_email 所做的有什么不同。
  • 你需要在你没有传递的URL中传递id
  • 你能告诉我你试图访问的 URL 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多