Когда вы запускаете MyObject.first.tail
, объект, который фактически отвечает, является AssociationProxy классом, который
удаляет большинство основных методов экземпляра и делегатов
# неизвестные методы для @target через
method_missing
Вы можете получить более подробную информацию о работе прокси:
MyObject.first.proxy_owner
MyObject.first.proxy_reflection
MyObject.first.proxy_target
Если вы заглянете в код, то увидите, что AssociationProxy передает метод some_method_in_base вашему классу MyState только в том случае, если MyState отвечает на some_method_in_base как вы можно увидеть в коде ниже.
private
# Forwards any missing method call to the \target.
def method_missing(method, *args, &block)
if load_target
if @target.respond_to?(method)
@target.send(method, *args, &block)
else
super
end
end
end
Следовательно, method_missing , который вы определили в целевой класс , никогда не вызывается.