ActiveRecord :: Base

时间:2017-09-30 00:10:52

标签: ruby-on-rails activerecord

class Graph < ActiveRecord::Base
    has_attached_file :data_source

    pp self.method_defined? :fdsafdafewafd
    pp self.method_defined? :data_source
    self.data_source
end

上面的代码产生了一种有趣的互动,我不确定我理解。

self.method_defined? :fdsafdafewafd

可以预见,这会返回false

self.method_defined? :data_source

可以预见,这会返回true

self.data_source

这导致:

NoMethodError:   undefined method `data_source' for
#<Class:0x0055dd1d71c6e0>

我的问题是,鉴于这个事实(我怀疑它与范围有关),为什么它上面的行返回true?如果在此范围内未定义方法,那么不应该使用method_defined?返回假?

1 个答案:

答案 0 :(得分:1)

has_attached_file :data_source实例方法添加到名为Graph的{​​{1}}类中。这就是data_source返回self.method_defined? :data_source的原因。

但是,当您执行true(相当于self.data_source)时,您将在Graph.data_source类本身上调用方法:data_source,该方法未定义;因此错误。您只能在Graph类的对象上调用该方法。

如果您要创建Graph的新实例化,例如Graph,然后您可以按预期g = Graph.new进行操作。