繁体   English   中英

Ruby on Rails教程混淆了Params hash的工作原理

[英]Ruby on Rails Tutorial Confused about how Params hash works

所以我看到其他人一直把我弄糊涂了,我已经阅读了其他答案,但我仍然感到困惑。

在删除请求期间如何将信息存储和解析为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哈希中。 这一直困扰我一段时间,所以请任何见解将不胜感激。

这是rails的工作方式。 如果你做一个rake routes你会看到你得到像DELETE /users/:id这样的东西。

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

它基于rails路由模型。

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

删除users /:id

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

因此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

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM