edit_password_reset_url(some_id_here)如何解析为https://example.com/password_resets/some_id_here/edit?

时间:2018-06-13 10:37:00

标签: ruby-on-rails

我一直在关注Learn RoR tutorials,我们有这条路线:

edit_password_reset GET    /password_resets/:id/edit(.:format)     password_resets#edit

我不明白这行:

<%= edit_password_reset_url(@user.reset_token, email: @user.email) %>

将翻译成:

https://example.com/password_resets/<some token here>/edit?email=<user email here>

更具体地说,rails如何知道第一个参数(@user.reset_token)是否会进入网址的:id部分?

控制器PasswordResetsController的{​​{1}}功能已定义但空白。

1 个答案:

答案 0 :(得分:1)

传递给edit_password_reset_url的第一个参数会替换运行:idrails routes)时看到的/password_resets/:id/edit(.:format)参数。有关此问题的文档可以在here找到。

您实际上可以通过以下方式更新此选项以使用更相关的参数,例如:token

resources :password_resets, param: :token

url帮助器还会使用参数哈希值,您可以使用email来提供其他参数。

稍微不必要的额外解释

如果你使用嵌套路线,比如edit_user_password_reset_url,这会产生类似于users/:id/password_resets/:token/edit(.:format)的东西。同样仍然适用 - 辅助器的第一个arg填充变量参数,但现在将采用数组,即edit_user_password_reset_url([@user.id, @token])

/结束稍微不必要的补充说明

控制器中的编辑操作可以为空,但通常会指定要在编辑视图中使用的资源(/password_resets/edit.html.erb或类似内容)。这通常包含一个表单,在提交时,它将触及同一控制器的update操作。

因此,在这种情况下,您可能希望编辑操作包含以下内容:

def edit
  @user = User.find_by_reset_token(params[:id]) # or params[:token] if you update as above
end

然后,在编辑视图中,您可以添加一个允许用户重置密码的表单。