Rails参数解释了吗?


228

任何人都可以params在Rails控制器中进行解释:它们来自何处以及它们所引用的是什么?

  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开发的背景是什么?您已经知道哪些技术?
莫里西奥·林哈雷斯

3
我已经使用HTML和CSS多年了。采用PHP,JS和Java的类。虽然很少使用MVC与php。我真的学习了使用Java编程的知识。而且我完全了解数据库理论。
Dru

Answers:


281

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

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

那么params[:foo]将是“ 1”,并且params[:boo]将是“章鱼”。

在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参数与PHP中的$ _REQUEST数组等效。


13
等同于$ _REQUEST,不同之处在于$ _REQUEST包括get,post和cookie数据,而params仅包括get和post数据。
Parziphal

3
@renocor POST数据也包含在Rails params哈希中。Cookie数据包含在session哈希中。
理查德·琼斯

这个答案排除了另一个参数来源:URL。有关更多信息,请参见hammar的答案。
理查德·琼斯

1
toasterlovin,听起来您好像没有阅读我的回答的第二句话,也没有看第一个例子。
大卫·格雷森

1
@AnkitDhingra ...我认为它将始终是字符串,因为HTTP参数实际上只是键/值对,Rails(最有可能是Rack gem)会根据键值将其解析为哈希和数组,但是我还没有看到任何类似的东西告诉Rails值是一个数字。
rubyprince 2014年

75

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

您可能知道,Rails使用一种称为路由的方法将请求定向到其相应的控制器动作。这些路由可能包含从URL中提取并放入的段params。例如,如果您有这样的路线:

match 'products/:id', ...

然后,对URL之类的请求http://example.com/products/42将设置params[:id]42


您如何获得第二个参数?像/ squad / id / member / id / stuff
weteamsteve

48

参数包含以下三组参数:

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

1
您能否将Note扩展User supplied parameters一些?例如,在UsersController中的params哈希示例将很有帮助。您的示例听起来像哈希看起来像:{first_name: "mike", user: {first_name: "mike"} ...} 正确吗?
2013年

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中的强参数有关。
2013年

2
我在Rails 4中看到重复的参数,但仅在JSON POST请求(使用Angularjs)下看到,而在Rails自己的HTML帖子下看不到。此链接解释了原因:stackoverflow.com/questions/10774972/...
霍曼

13

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

发布表单时,通常使用POST请求而不是GET请求来完成。您可以在浏览站点时将正常的Rails请求视为GET请求(如果有帮助的话)。

提交表单时,该控件将返回给应用程序。您如何获取已提交给表单的值?params是怎么回事。

关于您的代码。@vote = Vote.new params[:vote]使用params [:vote]数据创建新的Vote到数据库。假定您提交的表单用户以名称:vote命名,则其所有数据都在哈希表的:vote字段中。

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

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

从条件为item_id = item和user_id = uid的数据库中查找最新或最后插入的投票。

下一行需要最后的投票时间和当前时间。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.