我有一个包含activerecord的gemfile,因此我有.attributes
我可以调用我的模型实例将它们转换为哈希。
通过我的代码混合,我最终将OpenStruct而不是模型传递给我的一个方法,并得到了一个难以发现的bug。原因是OpenStruct#属性返回nil(并没有抛出错误,这会提醒我这个问题)。
我不知道如何定义OpenStruct#属性。
[2] pry(main)> show-source OpenStruct#attributes
错误:找不到OpenStruct#attributes的定义!
...
(byebug)OpenStruct.new.method(:attributes)
*** NameError异常:类'OpenStruct'的未定义方法'attributes'
...
(byebug)OpenStruct.new.attributes
零
如何找到此方法的源代码以及如何将其包含在内?
我有一种预感,就是在某处丢失了方法,这就是为什么它很难追查。但这样做有可能吗?
答案 0 :(得分:3)
如果你无法通过#method
获取它,那就是#method_missing
。这是一种与其他方法一样的方法,因此您可以以相同的方式找到源:
OpenStruct.instance_method(:method_missing).source_location
# => ["/Users/wink/.rbenv/versions/2.3.3/lib/ruby/2.3.0/ostruct.rb", 189]
答案 1 :(得分:3)
要清除一点,它不是一种新方法(尽管它表现得像一种方法)。
在我检查过的ruby 2.4中,method_missing
中的ostruct.rb
处理调用attr=
和attr
而没有定义新方法。有些类在第一次使用时会定义方法,但OpenStruct
不是其中之一。
答案 2 :(得分:1)
方法attributes
未在OpenStruct
上定义,只是method_missing
的工作方式。