Наше приложение представляет собой набор из 3-х движков, составляющих наш базовый гем. Другие гемы-плагины, написанные специально для нашего базового гема, можно использовать для добавления функциональности к базе.
В настоящее время у нас есть 2 настраиваемые директивы sprockets и 1 настраиваемый импортер Sass, который пытается динамически извлекать файлы SCSS из этих плагинов в базовый манифест. Надуманный пример выглядит примерно так:
//= depend_on_gemfile # mimics default "depend_on" functionality
//= depend_on_stylesheets # mimics default "depend_on" functionality
...
@import 'engine/namespace/settings/global';
@import 'engine/namespace/settings/colors';
@import 'engine/namespace/settings/fonts';
@import '[engine-plugins]/namespace/settings'; # mimics Sass Filesystem importer
...
Чтобы было ясно, это работает. У нас проблемы с тем, как Sass кэширует файлы, это слишком сложно для понимания и не является моей целью на данный момент.
Дело в том, что мы поняли, что удаление кастомных директив Sprockets и импортера Sass в пользу использования хелпера Rails также решит нашу проблему, так как ERB будет скомпилирован раньше SCSS, мы сможем найти и отформатировать все путей, необходимых во всех включенных плагинах, в строку и вывести ее в манифест. Что-то типа:
@import 'engine/namespace/settings/global';
@import 'engine/namespace/settings/colors';
@import 'engine/namespace/settings/fonts';
<%= load_plugin_stylesheets_for('settings'); %>
...
Это кажется гораздо более простым решением, так как все, что мы делаем, это находим каждый путь и преобразовываем эти пути в строки.
Проблема, похоже, в том, что помощники Rails полностью находятся за пределами домена Sprockets.
Я нашел некоторые ресурсы, но все они, похоже, относятся к Rails 3.
- Добавить пользовательские методы в конвейер ресурсов Rails 3.1?
- https://github.com/rails/rails/issues/3282
Мне любопытно, была ли у кого-нибудь эта проблема с Rails 4, решили ли они ее и как. Или, если я просто думаю об этом неправильно, и есть лучший способ подойти к проблеме без такого же чрезмерного усложнения, как у нас было раньше.
TL;DR
Я хотел бы использовать обычные помощники Rails внутри файла манифеста Sprockets. Версия Rails — 4.2.4. Мы запускаем двигатели. Это возможно?
ИЗМЕНИТЬ:
Этот комментарий ответил на мой вопрос.
После реализации этого решения в инициализаторе в нашем файле engine.rb
стали доступны все помощники Rails ActionView, включая мой пользовательский написанный помощник.