Найти каталог подкласса перед инициализацией, чтобы настроить пути сухого просмотра

Я использую режим сухого просмотра в нескольких движках Rails, и мне приходится дублировать конфигурацию в каждом подклассе.

class BaseView < Dry::View::Controller
  configure do |c|
    c.paths = [File.join(__dir__, 'templates')]
  end
end

class SubView < BaseView
  configure do |c|
    c.paths = [File.join(__dir__, 'templates')] # todo: remove me
  end
end

Причина в том, что мои представления могут быть глубоко вложены в подпапку app т.е..:

app/
app/foo/index.rb
app/foo/templates/index.html.erb
app/foo/bar/show.rb
app/foo/bar/templates/show.html.erb

Дополнительно BaseView класс не живет в том же самом драгоценном камне в большинстве случаев.

Если я удалю configure блок из SubView класс, шаблон больше не найден. __dir__ переменная содержит путь к каталогу BaseView учебный класс.

Я попытался реализовать метод после инициализации в базовом классе, который имеет доступ к каталогу подкласса. Но на этом этапе конфигурация невозможна из-за ограничений в dry-rb конфигурации. Конфигурация должна произойти до инициализации.

Единственное решение, которое я мог придумать, - это продублировать configure блокировать в каждом классе или иметь родительский класс для gem / engine, который настраивает все возможные пути к шаблонам.

Обычный подход поиска каталога определенного метода, который реализован в каждом подклассе, также не работает в этом случае, так как большинство представлений даже не определяют методы.

Есть ли лучшие способы доступа к каталогу данного класса во время фазы загрузки этого класса в методе родительского класса?

1 ответ

class BaseView < Dry::View::Controller
  def self.inherited(child)
    child.class_eval do
      configure do |c|
        c.paths = [File.join(__dir__, 'templates')]
      end
    end
  end
end

Перезвоните Class#inherited,

Другие вопросы по тегам