【发布时间】: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' => 'account_activations#update_email', as: 'update_email'。在这里我收到一条错误消息missing required keys: [:id]。 -
get 'account_activations/update_email' => 'account_activations#update_email', as: 'update_email'。在这里,我得到了一个链接,例如http://www.example.com/account_activations/update_email?email=foo%40example.com。因此,链接中再次缺少令牌。 -
resources :account_activations, only: :update。并将链接更改为<%= account_activation_url(@user.activation_token, email: @user.email) %>(当然还要更改控制器中的方法名称)。这会产生错误消息No route matches {:action=>"update", :controller=>"account_activations", :email=>"example@example.com", :id=>nil} missing required keys: [:id]。 -
get 'account_activations/:token/update_email' => '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' => 'account_activations#update_email', as: 'update_email' -
这会产生错误
missing required keys: [:token]。令牌应该以params[:id]的形式提供,即railstutorial(我在帐户激活链接中关注)写道:“令牌将在 params 哈希中以 params[:id] 的形式提供。”,这可能就是为什么我在原帖中提到的第一个替代方案最有意义。 -
为了您的更新,试试这个
get '/account_activations/:id/update_email' => 'account_activations#update_email', as: 'update_email'
标签: ruby-on-rails ruby ruby-on-rails-4 routes railstutorial.org