4

所以我看到其他人对此感到困惑,我也阅读了其他答案,但我仍然感到困惑。

在删除请求期间,信息是如何存储和解析到 params 哈希中的?我了解它在向其提交信息方面的工作原理。即,当发出 Put、Post 或 Get 请求时,我知道信息是通过参数哈希传递给相应的控制器操作的。

但是,基于用户部分 (_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 哈希如何获取存储在其中的用户 ID。我会理解它是否是 params[:user][:id] 因为我们正在发布具有其属性列表的用户。但是,我不明白 id 是如何直接存储到 params 哈希中的。这一直困扰我一段时间,所以请任何见解将不胜感激。

4

3 回答 3

3

这就是rails的工作方式。如果你这样做,rake routes你会看到你得到类似的东西DELETE /users/:id

这意味着您作为参数传递的用户对象被解释为:id. 当 Rails 看到这一点时,它会知道它必须查看传递的对象的 ID,按照惯例,所有模型都有一个 ID 字段。

于 2013-08-01T18:45:51.573 回答
2

因此,Rails 会读入您传递给它的 URL,然后决定如何处理它。

按照惯例,它会认为你传入的内容是

: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

祝你好运!

于 2013-08-01T20:43:54.940 回答
2

它基于 Rails 路由模型。

如果您在 config/routes.db 中使用了资源 :user ,它将创建以下路由(您可以通过运行 rake routes 来查看它):

删除用户/:id

符号 :id 表示您在调用 url 时在 users/ 之后添加的任何内容都将在 params 中设置为 :id。(在这种情况下,对于 DELETE HTTP 动词)

于 2013-08-01T18:44:33.090 回答