Найти каталог подкласса перед инициализацией, чтобы настроить пути сухого просмотра
Я использую режим сухого просмотра в нескольких движках 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
,