Ruby on rails 邮件链接的路由

Ruby on rails 邮件链接的路由,ruby-on-rails,ruby,ruby-on-rails-4,routes,railstutorial.org,Ruby On Rails,Ruby,Ruby On Rails 4,Routes,Railstutorial.org,账户激活 我用于帐户激活的路由和邮件链接如下: # Route: resources :account_activations, only: [:edit] # Link in mailer: <%= edit_account_activation_url(@user.activation_token, email: @user.email) %> 问题: 该链接应根据用户的电子邮件地址识别用户(就像帐户激活一样),并生成一个链接,如:http://www.example

账户激活

我用于帐户激活的路由和邮件链接如下:

# 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/update_email?email=foo%40example.com
。然而,它现在生成了一个链接,如
http://www.example.com/account_activations/update_email/foo@example.com

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

尝试的替代路线:

  • 获取'account\u activations/update\u email/:id'=>'account\u activations\update\u email',如:'update\u email'
    。这里我得到一个错误,说
    缺少所需的键:[:id]
  • 获取'account\u activations/update\u email'=>'account\u activations\update\u email',如:'update\u email'
    。在这里我得到了这样一个链接
    http://www.example.com/account_activations/update_email?email=foo%40example.com
    。因此,链接中的令牌再次丢失
  • 资源:仅帐户激活::更新
    。并将链接更改为
    (当然还要更改控制器中的方法名称)。这会产生错误消息
    没有路由匹配{:action=>“update”,:controller=>“account\u activations”,:email=>“example@example.com“,:id=>nil}缺少必需的键:[:id]
  • get'account\u activations/:token/update\u email'=>“account\u activations\update\u email”,如:“update\u email”
    。这导致错误
    缺少必需的密钥:[:令牌]
更新:

如果我使用路线:

get 'account_activations/:id/update_email' => 'account_activations#update_email', as: 'update_email'
根据
耙路径
,两者似乎相似:

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]
获取'account\u activations/update\u email/:id'=>'account\u activations\update\u email',如:'update\u email'
。在这里,我得到一个错误,说缺少必需的键:[:id]

您之所以会出现此错误,是因为在您的config/routes.rb文件中,您说的是
get'account\u activations/update\u email/:id
,因此无论何时触发此路由,都必须发送
id
。当您不发送
id
时,您将收到错误

get'account\u activations/update\u email'=>“account\u activations\update\u email”,例如:“update\u email”。
这里我得到了一个链接,比如
http://www.example.com/account_activations/update_email?email=foo%40example.com.
因此,链接中再次缺少令牌

如果您真的想将令牌与请求一起发送,您必须在
get'account\u activations/update\u email'
中提及它,就像
get'account\u activations/update\u email/:token'
,这样-它将被附加URL

资源:仅帐户激活::更新
。并将链接更改为
(当然还要更改控制器中的方法名称)。这将生成错误消息:

没有路由匹配{:操作=>“更新”,:控制器=>“帐户激活”,:电子邮件=>“example@example.com“,:id=>nil}缺少必需的键:[:id]

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

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

获取'account\u activations/update\u email/:id'=>'account\u activations\update\u email',如:'update\u email'
。在这里,我得到一个错误,说缺少必需的键:[:id]

您之所以会出现此错误,是因为在您的config/routes.rb文件中,您说的是
get'account\u activations/update\u email/:id
,因此无论何时触发此路由,都必须发送
id
。当您不发送
id
时,您将收到错误

get'account\u activations/update\u email'=>“account\u activations\update\u email”,例如:“update\u email”。
这里我得到了一个链接,比如
http://www.example.com/account_activations/update_email?email=foo%40example.com.
因此,链接中再次缺少令牌

如果您真的想将令牌与请求一起发送,您必须在
get'account\u activations/update\u email'
中提及它,就像
get'account\u activations/update\u email/:token'
,这样-它将被附加URL

资源:仅帐户激活::更新
。并将链接更改为
(当然还要更改控制器中的方法名称)。这将生成错误消息:

没有路由匹配{:操作=>“更新”,:控制器=>“帐户激活”,:电子邮件=>“example@example.com“,:id=>nil}缺少必需的键:[:id]

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


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

资源有什么问题:帐户激活,仅:[:更新]?尽管在我的情况下不是这样,我可以想象一个人可能已经在用
update
做其他事情了。但由于我的情况并非如此,我尝试了它(添加到orig中)
No route matches {:action=>"update_email", :controller=>"account_activations", :email=>"example@example.com", :id=>nil} missing required keys: [:id]