Rails params"方法"不是一种方法,是吗?

时间:2015-02-09 01:33:31

标签: ruby-on-rails ruby

Rails documentation中,以下示例用于显示服务器从POST请求中接收的内容:

def create
  render plain: params[:article].inspect
end 

在随后的描述中,文字说明

params方法是表示从表单进入的参数(或字段)的对象。 params方法返回一个ActiveSupport :: HashWithIndifferentAccess对象。

虽然我理解所有方法都是对象,但我不明白将params对象作为方法引用是如何正确的。具体来说,短语“返回一个ActiveSupport :: HashWithIndifferentAccess对象”告诉我,有两个调用正在进行 - 在python中可能是什么样的:

params().__getitem__('article')

但我不认为这是实际发生的事情。

围绕这些线的conversation也指params作为一种方法,所以我开始认为我必须遗漏一些东西。

3 个答案:

答案 0 :(得分:4)

  

我是Ruby的新手,虽然我知道所有方法都是对象,

不,他们不是。方法属于对象(更确切地说:方法在模块中定义,并在对象的上下文中执行),但它们本身不是对象。 (但是,可以通过调用method方法来获取反映代理,该方法代表方法的概念,该方法返回Method个对象。)

  

我不明白将params对象称为方法是怎么回事。

因为这是一种方法。不是一个对象。

还有什么?从语法上讲,很明显它只能是三件事之一:关键字,变量或方法调用。

它不能是关键字,因为Rails只是一个Ruby库,Ruby库不能改变语言的语法(例如添加或删除关键字)。它不能是变量,因为为了将它解析为变量,解析器需要在同一个块中看到它的赋值。

Ergo,唯一能可能的是方法调用。你甚至不需要知道关于Rails的任何事情就知道这一点。它只是基本的Ruby语法101。

  

具体来说,短语“返回一个ActiveSupport :: HashWithIndifferentAccess对象”告诉我有两个调用正在进行 - 在python中可能是什么样的:

params().__getitem__('article')
     

但我不认为这是实际发生的事情。

这正是发生的事情。您调用方法params,然后通过调用方法[]调用返回的对象上的方法params

这与foo.bar完全不同:您拨打foo,然后在bar的返回值上调用foo

答案 1 :(得分:2)

params方法是一种方法,返回一个哈希(它包含有关发送给应用程序的参数的一些细节)。简化它看起来像这样:

def fake_params
  { :controller => 'foo', :action => 'bar' }
end

您可以直接在返回的哈希上调用另一个方法,如下所示:

fake_params[:action]    #=> 'bar'

答案 2 :(得分:1)

paramsActionController::Metal中定义的方法,它返回request.parameters个对象。

https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal.rb#L140