params方法如何工作?

时间:2017-07-25 10:20:16

标签: ruby-on-rails ruby

我一直试图弄清楚params方法是如何工作的,而且我对这个过程有点困惑。

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

所以我的遗漏链接似乎是post id传递给params方法的时候?

3 个答案:

答案 0 :(得分:2)

因为其他人已经解释过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即可获得你需要的价值。

答案 1 :(得分:1)

  

params方法如何工作?

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

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

然后params[:post]将是" 1"而params[:comment]将是"演示"。

在HTTP / HTML中,params实际上只是一系列键值对,其中键和值是字符串,但Ruby on Rails有一个特殊的语法,使params成为具有哈希或数组或字符串的哈希值内部。

可能看起来像这样:

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

关于params的Rails指南链接:guides

答案 2 :(得分:0)

Params是带有Indifferent访问权限的红宝石哈希,意思是

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

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

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

params是在接口加载的客户端上形成的,考虑一个具有提交按钮的表单。当您按提交时,填写表单或任何隐藏文本框的数据将形成一个哈希并传递给请求。这在服务器端收到时将被称为params或request params。

对于获取请求:通过网址发送的数据将在后端读取为params。

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

对于Put请求:在身体上发送的数据将被称为params。

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