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

mri*_*ula 6 ruby ruby-on-rails

所以,我想了入门的Ruby on Rails的的部分指导这里.

我不明白本教程中的一行.引用它:

PARAMS方法是代表参数(或场)从表单来的在对象中.

我确实有一些以前的rails经验,我总是假设params是一个哈希.但在这里他们称之为method which is an object.

params一个method还是一个hash?另外,在ruby中,方法也是对象吗?

Jay*_*rio 13

  • params是一个返回对象方法.想想它是这样的:ActionController::Parameters

    def params
      ActionController::Parameters.new(...)
    end
    
    Run Code Online (Sandbox Code Playgroud)

    示例(控制器或视图中的某个位置):

    puts params
    #=> <ActionController::Parameters ...>
    puts params.is_a? Object
    #=> true
    
    Run Code Online (Sandbox Code Playgroud)
  • Ruby中的方法总是返回一个(注意:nil也是一个),除非没有定义该方法.请记住,params即使你的代码中没有看到它已经由Rails定义了)

  • Ruby中方法的每个"返回值" 都是一个对象.甚至nil价值也是一个NilClass 对象.整数,字符串,数组和哈希也是对象.为什么?因为eveeeeery事物从Object 继承/开始.

  • 如果<Rails 5.1:

  • 但现在在> = Rails 5.1:

    • ActionController::Parameters NO LONGER继承自Hash ,所以你会认为你不能再使用像上面代码那样的方法了.sort,或者.has_key?你仍然可以!因为ActionController::Parameters定义了自己的自定义方法,从"看起来像"方法Hash.
      • 注意:并非所有Hash方法都重新定义ActionController::Parameters.随意比较的方法,这里这里,尤其sort是法Hash法并没有重新定义ActionController::Parameters,所以你不能做params.sort对Rails> = 5.1了.


saw*_*awa 7

  1. 描述有点截断.确切地说,它应该被理解为:

    params方法的返回值是[an]对象...

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

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

  • @EricDuminil嘿,不要试图混淆初学者.`Method`类的实例由名为`method`的方法创建,并且是一个对象.它与方法不同. (2认同)
  • Eric先前的评论使我运行`puts方法(:params).source_location`.它引导我到https://github.com/rails/rails/blob/4b969ea417f097d217ff1f662d2fe8c406d21b99/actionpack/lib/action_controller/metal/strong_parameters.rb,在那里我真的看到了`params`方法;) (2认同)