Rails参数解释?

241

有人可以解释一下Rails控制器中的params吗:它们来自哪里,以及它们引用了什么?

  def create
    @vote = Vote.new(params[:vote])
    item = params[:vote][:item_id]
    uid = params[:vote][:user_id]
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
    last_vote_time = @extant.created_at unless @extant.blank?
    curr_time = Time.now
  end

我希望能够逐行阅读这段代码并理解其中的含义。


2
你在服务器端Web开发方面有什么背景?你已经了解哪些技术? - Maurício Linhares
3
我已经使用HTML和CSS多年,参加过使用PHP、JS和Java的课程,虽然使用了很少的PHP MVC。我真正学会编程是通过Java。我彻底理解数据库理论。 - Dru
5个回答

293

参数是用户请求网页时从其浏览器中获取的。对于最常见的HTTP GET请求,参数被编码在URL中。例如,如果用户的浏览器请求

http://www.example.com/?foo=1&boo=octopus

那么 params[:foo] 将是“1”,params[:boo] 将是“octopus”。

在HTTP/HTML中,参数实际上只是一系列键值对,其中键和值都是字符串,但Ruby on Rails有一种特殊的语法,使参数成为哈希并带有内部哈希。例如,如果用户的浏览器请求

http://www.example.com/?vote[item_id]=1&vote[user_id]=2

那么 params[:vote] 将是一个哈希表,params[:vote][:item_id] 将是“1”,params[:vote][:user_id] 将是“2”。

Ruby on Rails的params相当于PHP中的$_REQUEST数组


13
与 $_REQUEST 相当,但 $_REQUEST 包括 get、post 和 cookie 数据,而 params 只包括 get 和 post 数据。 - Parziphal
3
Rails的params哈希中也包含了POST数据。Cookie数据则包含在session哈希中。 - Richard Jones
这个答案忽略了另一个参数来源:URL。请参考hammar的答案获取更多信息。 - Richard Jones
1
Toasterlovin,听起来你没有读我的回答的第二句话,也没有看第一个例子。 - David Grayson
1
@AnkitDhingra...我认为它将始终是字符串,因为HTTP参数实际上只是键/值对,Rails(很可能是Rack gem)根据键值将其解析为哈希和数组,但我没有看到任何关于告诉Rails该值是数字的内容。 - rubyprince
显示剩余2条评论

79

正如其他人所指出的那样,params值可以来自GET请求的查询字符串或POST请求的表单数据,但还有第三个地方可以获取它们:URL的路径。

你可能知道,Rails使用称为路由的东西将请求定向到相应的控制器操作。这些路由可能包含从URL中提取并放入params中的段。例如,如果你有这样一个路由:

match 'products/:id', ...

那么对于类似http://example.com/products/42的URL请求,将会把params[:id]设置为42


你如何获取第二个参数?例如/squad/id/member/id/stuff。 - weteamsteve

51
Params包含以下三组参数:
  1. 用户提供的参数
  • GET (http://example.com/url?param1=value1&param2=value2会将params[:param1]和params[:param2]设置为相应的值)
  • POST (例如JSON,XML将自动解析并存储在params中)
  • 注意:默认情况下,Rails会复制用户提供的参数并将它们存储在params[:user]中,如果在UsersController中,则可以使用wrap_parameters设置进行更改
  1. 路由参数
  • match '/user/:id' routes.rb中将设置params[:id]
  1. 默认参数
  • params[:controller]params[:action]始终可用,并包含当前控制器和操作

1
你能否在“用户提供的参数”下扩展一下你的注释?例如,在UsersController中提供params哈希的示例将会很有帮助。你的示例让人感觉哈希看起来像这样:{first_name: "mike", user: {first_name: "mike"} ...},这是正确的吗? - 7stud
1
我在rails4中没有看到这个。例如:{"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}。如果我错了,请原谅,我是rails的初学者。根据你的注释,我应该看到:{"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple"=>{"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"}。我不知道这是否与rails4中的“_strong parameters_”有关。 - 7stud
2
我在Rails 4中看到了重复的参数,但仅在json POST请求(使用Angularjs)下而不是Rails自己的HTML posts。该链接解释了原因: https://dev59.com/SGgv5IYBdhLWcg3wNeDS - Homan

13

基本上,参数是用户指定的数据给rails应用程序。

当您提交表单时,通常使用POST请求而不是GET请求。如果有帮助的话,您可以将正常的rails请求视为GET请求,当您浏览网站时。

当您提交表单时,控制权被抛回应用程序。如何获取您提交到表单的值?这就是params的作用。

关于您的代码。@vote = Vote.new params[:vote]使用params[:vote]中的数据创建一个新的投票并将其存储到数据库中。假设您提交的表单名称是:vote,则其所有数据都在哈希表的此:vote字段中。

接下来的两行代码用于获取用户已提交到表单的项目和uid。

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])

查找符合条件 item_id = item 且 user_id = uid 的最新投票,或者最后插入的投票。

接下来的行获取最后一次投票时间和当前时间。


9

5
感谢您澄清了 params 是一个方法。Ruby 在区分变量和方法方面可能会比较困难。 - samrap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接