【问题标题】:How does the params method work?params 方法是如何工作的?
【发布时间】:2017-07-25 10:20:16
【问题描述】:

我一直在试图弄清楚 params 方法是如何工作的,但我有点卡在这个过程上。

例如,如果用户点击索引页面中的某个博客文章,我猜想 link_to 方法会调用 Post 控制器和 show 操作及其块 @post = Post.find(params[:id]),然后去数据库查找发布并且视图显示它。

所以我缺少的链接似乎是 post id 何时传递到 params 方法中?

【问题讨论】:

  • 你需要了解 ruby​​ 中的hash

标签: ruby-on-rails ruby


【解决方案1】:

因为其他人已经解释过params,我就直接回答你的一个问题:

post id 什么时候传入 params 方法

我认为最好用一个例子来解释;见下文:

假设您点击了一个链接: /posts/1/?param1=somevalue1&param2=somevalue2

Rails 服务器接收到客户端想要查看此GET /posts/1/?param1=somevalue1&param2=somevalue2 地址的请求。

要确定 Rails 服务器将如何响应,服务器将首先转到您的 routes.rb 并找到将处理此请求的匹配控制器操作:

# let's say your routes.rb contain this line
# resources :posts

# resources :posts above actually contains MANY routes. One of them is below
# For sake of example, I commented above code, and I only want you to focus on this route:
get '/posts/:id', to: 'posts#show'
  • 从上面注意到有这个:id,Rails 会自动将params[:id] 设置为这个:id 的值。这是params[:id]来自哪里的问题的答案。

  • 不一定是:id;你可以随意命名它。你甚至可以有多个这样的 URL 参数(只是一个例子):

    get /users/:user_id/posts/:id 将分别自动设置params[:user_id] 和params[:id] 的值。

  • 除了像:id 这样的URL 参数之外,Rails 还会自动从路由中将值注入params[:controller] 和params[:action]。从上面的示例中说,get '/posts/:id', to: 'posts#show',这会将params[:controller] 设置为'posts',并将params[:action] 设置为'show'。

  • params 值也来自其他来源,如 Mayur 描述的“查询字符串”,也来自请求的body,例如当您提交表单时(表单值设置在请求的body 部分中),就像当您有 JSON 请求时,Rails 会自动解析所有这些请求以方便您,因此您只需访问 params 并根据需要获取值。

【讨论】:

    【解决方案2】:

    参数是 ruby​​ 中的哈希值,具有Indifferent 访问权限,这意味着,

    hsh = {"a" => 1, "b" => 2}
    

    将此 hsh 视为从浏览器的 POST 请求返回的参数,它是一个键值对,键为字符串。因为它是一个参数所以值可以被访问为

      hsh["a"]
      => 1
      hsh [:a]
      => 1
    

    参数是在加载界面的客户端上形成的,考虑一个具有提交按钮的表单。当您按下提交时,表单中填写的数据或任何隐藏的文本框都会形成一个散列并通过请求传递。这在服务器端收到时将被称为参数或请求参数。

    对于 Get 请求:通过 url 发送的数据将被读取为后端的参数。

     GET: http://www.abx.com?user=admin
     params on backend: {"user" => "admin"} 
     This will be displayed in rails server logs
    

    对于 Put 请求:通过 body 发送的数据将被称为参数。

     PUT: http://www.abx.com
     data: {"user" => "admin"} Client side
     params on backend: {"user" => "admin"} 
     This will be displayed in rails server logs
    

    【讨论】:

      【解决方案3】:

      params 方法是如何工作的?

      当用户请求页面时,参数来自用户的浏览器。对于最常见的 HTTP GET 请求,参数被编码在 URL 中。例如,如果用户的浏览器请求

      http://www.example.com/?post=1&comment=demo
      

      那么params[:post] 将是“1”,params[:comment] 将是“演示”。

      在 HTTP/HTML 中,参数实际上只是一系列键值对,其中键和值都是字符串,但是 Ruby on Rails 有一种特殊的语法可以使参数成为带有散列或数组或字符串的散列里面。

      它可能看起来像这样:

      {"post"=>"1", "comment"=>"demo"}
      

      参数上的 Rails 指南链接:guides

      【讨论】:

      • “成为一个包含哈希的哈希” - 不一定是哈希。可以是字符串、散列或数组。我很确定也会进行一些布尔转换。
      猜你喜欢
      • 1970-01-01
      • 2015-04-18
      • 2013-03-11
      • 2019-05-20
      • 2012-04-21
      • 2016-07-26
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多