我一直在关注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}}功能已定义但空白。
答案 0 :(得分:1)
传递给edit_password_reset_url
的第一个参数会替换运行:id
(rails 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
然后,在编辑视图中,您可以添加一个允许用户重置密码的表单。