Может быть, вы пропустили последний абзац в принятом ответе связанного поста Как перечислить все методы для объекта в Ruby? :
Добавлено Обратите внимание: has_many не добавляет методы напрямую. Вместо этого механизм ActiveRecord использует методы Ruby method_missing и responseds_to для обработки вызовов методов на лету. В результате методы не перечислены в результате метода method.
Чтобы было яснее, что происходит, пример кода:
class Foo
def hello
puts 'Hello'
end
def method_missing(name, *args, &block)
case name
when :unknown_method
puts "handle unknown method %s" % name # name is a symbol
else
super #raises NoMethodError unless there is something else defined
end
end
end
foo = Foo.new
p foo.respond_to?(:hello) #-> true
p foo.respond_to?(:unknown_method) #-> false
foo.unknown_method #-> 'handle unknown method unknown_method'
foo.another_unknown_method #-> Exception
Метод unknown_method
никогда не бываетопределено, но есть метод для обработки неизвестных методов. Таким образом, класс создает впечатление существующего метода, но его нет.
Может быть Как я могу получить исходный код метода динамически, а также, какой файл находится в этом методе в , помогаетполучить информацию о содержимом:
Foo.instance_method(:method_missing).source_location
Добавление
Когда вы определяете свой собственный method_missing
, вам также следует изменить поведение respond_to?
с помощью respond_to_missing?
def respond_to_missing?(method, *)
return method == :unknown_method || super
#or if you have a list of methods:
#~ return %i{unknown_method}.include?(method) || super
#or with a regex for
#~ method =~ /another_(\w+)/ || super
end
end
См. Также `response_to?` Против `response_to_missing?` для подробностей.