所以我看到其他人一直把我弄糊涂了,我已经读过其他答案,但我仍然感到困惑。
在删除请求期间如何将信息存储和解析为params哈希?我理解它在向其提交信息方面的工作原理。即,当发出Put,Post或Get请求时,我理解信息通过params散列传递给相应的控制器动作。
但是,基于用户partial(_user.html.erb)中的以下代码:
<li>
<%= gravatar_for user, size: 52 %>
<%= link_to user.name, user %>
<% if current_user.admin? && !current_user?(user) %>
<%= link_to "delete", user, method: delete,
data: {confirm: "You sure?"} %>
<% end %>
</li>
DESTROY操作中的代码自动路由到:
def destroy
User.find(params[:id]).destroy
flash[:success] = "User destroyed."
redirect_to users_url
end
我不明白params hash如何获取存储在其中的用户ID。我知道它是否是params [:user] [:id],因为我们发布了具有其属性列表的用户。但是,我不知道如何将id直接存储到params哈希中。这一直困扰我一段时间,所以请任何见解将不胜感激。
答案 0 :(得分:3)
这是rails的工作方式。如果您执行rake routes
,您会看到DELETE /users/:id
之类的内容。
这意味着您作为参数传递的用户对象将被解释为:id
。当Rails看到这一点时,它会知道它必须查看传递的对象的ID,按照惯例,所有模型都有一个ID字段。
答案 1 :(得分:2)
它基于rails路由模型。
如果您使用资源:config / routes.db中的user,它将创建以下路由(您可以通过运行rake路由来查看它):
删除users /:id
符号:id表示在用户/调用url后添加的任何内容都将在params中设置为:id。 (在这种情况下,对于DELETE HTTP动词)
答案 2 :(得分:2)
因此,Rails会读入您传入其中的网址,然后决定如何处理它。
按照惯例,它会认为你传递给它的是
:controller/:id
所以它可能做的是将url作为字符串,并根据/
字符将其分解。
在IRB中尝试此操作。
controller, id = "hello/1".split("\/")
然后输入
id
想象一下,这个新设置的id
变量会像这样传递到params
哈希:
params = {}
params[:id] = id
现在输入
params[:id]
事实更为复杂。我正在查看源代码以尝试找到具体的方法,但是有太多事情正在发生。请尝试在ActionDispatch
http://api.rubyonrails.org/classes/ActionDispatch/Routing.html
祝你好运!