在Rails documentation中,以下示例用于显示服务器从POST请求中接收的内容:
def create
render plain: params[:article].inspect
end
在随后的描述中,文字说明
params方法是表示从表单进入的参数(或字段)的对象。 params方法返回一个ActiveSupport :: HashWithIndifferentAccess对象。
虽然我理解所有方法都是对象,但我不明白将params对象作为方法引用是如何正确的。具体来说,短语“返回一个ActiveSupport :: HashWithIndifferentAccess对象”告诉我,有两个调用正在进行 - 在python中可能是什么样的:
params().__getitem__('article')
但我不认为这是实际发生的事情。
围绕这些线的conversation也指params作为一种方法,所以我开始认为我必须遗漏一些东西。
答案 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)
params
是ActionController::Metal
中定义的方法,它返回request.parameters
个对象。
https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal.rb#L140