ruby-on-rails - Rails 参数方法 : Why can it be accessed like a hash?

标签 ruby-on-rails ruby

查看这段代码:

参数[:id]

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

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

最佳答案

params 是一个方法,你是对的,但是这里的 params 方法返回一个 ActionController::Parameters 的实例,我们调用 hash访问器方法 #[] 就可以了。

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

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

params[:id] # => 101
params[:foo] # => 'bar'

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

对 rails params 方法的引用: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

ruby 初学者须知:在ruby 中,我们可以调用不带括号的方法。所以,上面的调用等同于 params()[:id]

关于ruby-on-rails - Rails 参数方法 : Why can it be accessed like a hash?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69505389/

相关文章:

ruby-on-rails - Rspec - Controller 测试错误 - Paperclip::AdapterRegistry::NoHandlerError: 找不到 "#<File:0x531beb0>"的处理程序

ruby-on-rails - ElasticSearch异步删除?在Rails应用中删除索引后仅200

ruby-on-rails - Redis 在大型 DEL 和 HMSET 函数上消耗最大内存

ruby-on-rails - Rspec 测试模型为 null : false constraint

ruby - 查看 Ruby 对象是否实现了接受一定数量参数的方法

ruby - 将 ruby​​ 项目从 1.8.6 升级到 1.8.7

arrays - 选择模式元素与规则匹配的数组排列

ruby-on-rails - 未定义的方法 `scan' 为 {"tooth"= >""} :Hash

ruby-on-rails - 设计处理重复的登录请求

mysql - Rails 4 中 'users' 中的未知列 'where clause'