Rails params 方法:为什么可以像哈希一样访问?

mew*_*ewi 2 ruby ruby-on-rails

查看这段代码:

params[:id]

Params 被认为是一种方法。如果我错了请纠正我。但这就像从哈希中读取一样。所以,我目前很困惑。

如果 params 是一个方法:所示的代码示例如何工作?

the*_*tor 8

你是对的,这params是一个方法,但这里该params方法返回一个实例ActionController::Parameters,我们#[]对其调用哈希访问器方法。

这是 ruby​​ 中调用返回对象的方法的常见模式。让我们通过一个简单的例子来看看:

def params
  {
    id: 101,
    key: 'value',
    foo: 'bar'
  }
end

params[:id] # => 101
params[:foo] # => 'bar'
Run Code Online (Sandbox Code Playgroud)

正如您在示例中看到的,方法params返回一个哈希对象,我们对#[]返回的对象调用哈希访问器方法。

参考railsparams方法:https://github.com/rails/rails/blob/5e1a039a1dd63ab70300a1340226eab690444cea/actionpack/lib/action_controller/metal/strong_parameters.rb#L1215-L1225

def params
  @_params ||= begin
    context = {
      controller: self.class.name,
      action: action_name,
      request: request,
      params: request.filtered_parameters
    }
    Parameters.new(request.parameters, context)
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby 初学者注意:在 ruby​​ 中,我们可以调用不带括号的方法。所以,上面的调用相当于params()[:id].