#ruby #inheritance #module
Вопрос:
У меня есть декоратор, который наследуется от базового декоратора. Как базовый, так и подкласс включают модули, которые имеют метод с одинаковым именем, например:
class ApplicationDecorator < Draper::Decorator
include ApplicationDecorator::LayoutTabs
...
end
end
class ApplicationDecorator < Draper::Decorator
module LayoutTabs
def show_task_tab?
current_tab=='tasks' || respond_to?(:tasks)
end
end
end
class InvoiceDecorator < ApplicationDecorator
include InvoiceDecorator::LayoutTabs
...
end
end
class InvoiceDecorator < ApplicationDecorator
module LayoutTabs
def show_task_tab?
false
end
end
end
Удивительная проблема заключается в том, что когда я вызываю show_task_tab?
экземпляр invoice, вызывается метод из базового класса, а не подкласс, как я ожидал бы:
Invoice.last.decorate.show_task_tab?
Это доходит show_task_tab?
до того, что в ApplicationDecorator::LayoutTabs
нет InvoiceDecorator::LayoutTabs
.
Я что-то здесь упускаю?
Однако, когда я переезжаю show_task_tab?
из InvoiceDecorator::LayoutTabs
и в InvoiceDecorator
вызов Invoice.last.decorate.show_task_tab?
, решает InvoiceDecorator
не ApplicationDecorator::LayoutTabs
делать этого .
Итак, главный вопрос заключается в том, как я могу включить метод в модуль, включенный подклассом, и чтобы этот метод переопределял метод с тем же именем в модуле суперкласса? Я так и думал…
Комментарии:
1. «могу ли я иметь метод в модуле, включенном подклассом, и чтобы этот метод переопределял метод с тем же именем в модуле суперкласса?» — да, вы можете, именно так, как у вас есть, на самом деле: pastebin.com/xkD97WSN . Что бы ни происходило в вашем случае, это в дрейпере и как это происходит
decorate
.