Ruby on Rails - params是一个方法还是一个哈希表?

7

所以,我正在尝试Ruby on Rails指南中的入门部分这里

我不理解本教程中的一行。引用如下:

params方法是表示来自表单的参数(或字段)的对象。

我之前有一些Rails的经验,我一直认为params是一个哈希。但在这里,他们称其为一个方法,也是一个对象

params是一个方法还是一个哈希?在Ruby中,方法也是对象吗?


4
这个措辞有问题。它应该说“*params方法返回表示...的对象”。 - ndnenkov
3个回答

16
  • params 是一个方法,返回一个 ActionController::Parameters 对象。可以将其类比为:

  • params 是一个方法,返回一个 ActionController::Parameters 对象。可以将其类比为:

  • def params
      ActionController::Parameters.new(...)
    end
    

    示例(在您的控制器或视图中的某个地方)

    puts params
    #=> <ActionController::Parameters ...>
    puts params.is_a? Object
    #=> true
    
  • 方法在Ruby中总是返回一个(注意:nil也是一个),除非该方法未定义。请记住,即使你在代码中看不到它,params已经被Rails定义了。

  • Ruby中每个方法的“返回值”都是一个对象,甚至nil值也是一个NilClass 对象。整数、字符串、数组和哈希表也是对象。为什么?因为一切都继承/从Object 开始。

  • 如果小于Rails 5.1:

    • ActionController::Parameters继承自Hash ,这意味着你可以使用所有的Hash 方法点击此处查看Hash方法)。

      示例:

      params.sort ...
      params.each ...
      params.has_key?(:controller)
      
  • 但是在 Rails 5.1 及以上版本中:

    • ActionController::Parameters 不再继承自Hash类,因此您可能认为您不能再使用诸如上面代码中的.sort.has_key?等方法了,但实际上仍然可以!因为ActionController::Parameters定义了自己的自定义方法,这些方法“看起来像”从Hash继承而来的方法。
      • 注意:并非所有的 Hash 方法都在ActionController::Parameters中重新定义。请随意比较此处此处的方法,特别是sort方法,它是Hash方法,在ActionController::Parameters中没有被重新定义,因此您不能在Rails >= 5.1中再使用params.sort

  • 7
    1. 描述略有缩短。确切地说,应该阅读为:

      params 方法的返回值是一个对象...

      方法不是一个对象,但是当您执行一个方法时,它总是会返回一个对象。在这种情况下,params 是一个方法,而不是一个对象,但它有一个返回值,即一个对象。

    2. 在旧版本的 Rails 中,params 的返回值曾经是哈希,但现在不再是哈希了。


    2
    @EricDuminil 嘿,不要试图混淆初学者。Method类的实例是由名为method的方法创建的,并且是一个对象。它与方法本身是不同的。 - sawa
    你说得对。我在我们的Ruby大神的回答中了解更多信息,并删除了我的先前评论。 - Eric Duminil
    2
    Eric之前的评论让我运行了puts method(:params).source_location。这使我找到了https://github.com/rails/rails/blob/4b969ea417f097d217ff1f662d2fe8c406d21b99/actionpack/lib/action_controller/metal/strong_parameters.rb,我在那里真正看到了`params`方法 ;) - mridula

    3

    params 是一个返回对象的方法 - 它返回 ActionController::Parameters 的实例。

    它有一些方法,使其的行为类似于哈希表,但它比哈希表更复杂。

    在 Ruby 中,方法也是对象吗?

    参考这个讨论串


    那么为什么它被称为参数方法呢? - mridula
    @mridula 我重新表达了答案 - Andrey Deineko
    “返回一个对象的方法”可能会给人留下某些方法不返回任何对象的印象。 - Eric Duminil
    @EricDuminil 我不这样理解。对我来说,它只是直接回答了 params 是对象还是方法的问题。 - Andrey Deineko
    “params”是一个方法。在Ruby中,每个方法都返回一个对象。在这种情况下,“params”返回一个实例... - Eric Duminil

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接