Rails params解释说?

时间:2011-07-30 21:13:22

标签: ruby-on-rails ruby

任何人都可以在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

我希望能够逐行阅读此代码并了解正在发生的事情。

5 个答案:

答案 0 :(得分:266)

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

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

然后params[:foo]将为“1”而params[:boo]将为“章鱼”。

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

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参数等同于$_REQUEST array in PHP

答案 1 :(得分:73)

正如其他人所指出的,params值可以来自GET请求的查询字符串,也可以来自POST请求的表单数据,但是它们也可以来自第三位: URL。

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

match 'products/:id', ...

然后,对http://example.com/products/42等网址的请求会将params[:id]设置为42

答案 2 :(得分:46)

Params包含以下三组参数:

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

答案 3 :(得分:13)

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

发布表单时,通常使用POST请求,而不是GET请求。您可以将正常的rails请求视为GET请求,当您浏览该站点时,如果它有帮助。

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

关于您的代码。 @vote = Vote.new params[:vote]使用params [:vote]的数据创建新的数据库投票。鉴于您的表单用户提交的名称是在name:vote下命名的,它的所有数据都在这个:hash的投票字段中。

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

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

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

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

答案 4 :(得分:4)

在Rails端,params是一个返回ActionController::Parameters对象的方法。 见https://stackoverflow.com/a/44070358/5462485