Правильный ли порядок приоритета / поиска этого метода модуля?

#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 .