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]