【问题标题】:Ruby on Rails Tutorial Confused about how Params hash worksRuby on Rails 教程对 Params 哈希如何工作感到困惑
【发布时间】:2013-08-01 18:37:47
【问题描述】:

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

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

但是,基于用户部分 (_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 哈希中的。这已经困扰了我一段时间,因此请提供任何见解。

【问题讨论】:

  • 杰克,看看 link_to() 助手创建的 html。此外,如果您想查看参数中的内容,请安装 pry (pry-full)(非常有用的 gem)并在控制器的 destroy 方法中粘贴 binding.pry 以查看最终传入的内容

标签: ruby-on-rails ruby params


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    它基于rails路由模型。

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

    删除用户/:id

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

    【讨论】:

    • 那么您可以使用 user_path(user) ,它将返回 'users/13' 其中 13 是 user.id !
    • 谢谢各位。我想我现在明白了。我将不得不开始养成查看由我的代码生成的实际 html 的习惯。结合这些答案,可以清楚地了解正在发生的事情。再次感谢!!
    【解决方案3】:

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2010-10-19
      • 1970-01-01
      • 2016-10-04
      • 2016-05-03
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      相关资源
      最近更新 更多