Итак, я переработал это приложение с несколькими оболочками, чтобы использовать конвейер активов, введенный в Rails 3.1. По большей части это было удивительно легко, и я влюблен в способность предварительной обработки, которая позволяет использовать встроенный Ruby в ваших CSS/JS-файлах. Однако я столкнулся с серьезной проблемой, которая, несмотря на силу Sprockets, кажется сложной для решения. Мое приложение может быть запущено с любым количеством скинов (или «идентичность»), которые выбраны во время выполнения. Этот параметр «identity» устанавливает такие вещи, как каталог кеша, соединение с базой данных, пути просмотра - и даже пути к ресурсам. Хотя все «идентификаторы» могут иметь свою собственную таблицу стилей, есть также общий, который используется во всех экземплярах. Таким образом, структура папок активов выглядит следующим образом:Контейнер активов Rails - как включить актив не в путь активов?
В /app/assets/stylesheets/aplication.css.erb:
<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
Это загружает две таблицы стилей, и самое главное он использует сконфигурированные пути активов для решения их (поэтому я использую require_assets
вместо стандартных require
и include
директив, так как они не попадают в резольвер). Он возвращает найденные первые совпадения и позволяет мне очень легко переопределить часть или весь стиль по умолчанию. Так
/app/assets/stylesheets/shared.css
может быть отменено, поместив файл с тем же именем в папке экземпляра активов
/app/assets/[identity]/stylesheets/shared.css
, и если не существует такого файла он молча возвращается к shared.css по умолчанию.
Все это работает блестяще - я использую ту же технику для Javascripts, изображений и шрифтов, и все становится аккуратно обработанным и упакованным во время предварительной компиляции. НО. Существует тип (бокового) наследования, которого я не могу достичь; иногда кожа для идентичности настолько похожа на другую, что отличается только несколькими линиями доения (например, идентичная компоновка, но с другой цветовой схемой), и я действительно хочу иметь возможность сделать что-то вроде этого:
/stylesheets/application.css.erb:
<% require_asset("shared.css") %>
<% require_asset("overrides.css") %>
активы/current_identity/стилей/overrides.css:
<% require_asset("../../some_other_identity/stylesheets/overrides.css") %>
/* followed by the dosen or so lines that differ for this skin */
...
Это FAILS потому, что в текущем контексте "some_other_identity" не в Асс t - Rails не находит файл в режиме dev, и, конечно же, он также не включен во время предварительной компиляции. И если я включу его в путь активов, он загрузит неправильный overrides.css (может быть только один). Таким образом, я экспериментировал с проставлением что-то вроде этого в верхней части overrides.css:
<%= File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css")) %>
/* rest of CSS */
...
И действительно, что работает точно так же, как и ожидалось. НО. Поскольку я использую конвейер активов для обслуживания всех активов, я больше не могу ссылаться на изображения в CSS с фиксированным путем - я должен использовать <%= asset_path("some_image.png") %>
, чтобы распознаватель пути мог работать с его магией. Это означает, что мой overrides.css
действительно overrides.css.erb
, и, конечно, предварительная обработка ERB не происходит, когда вы делаете File.read()
. Итак, я застрял! Помогите! Кто угодно?
Edit: Если я использую
<%= ERB.new(File.read(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb"))).result %>
это попытаться разобрать Еврорадио, но я получаю
undefined method `asset_path' for main:Object
, который, конечно, из-за меня, используя asset_path("some_image.png")
и т.д. в файле I Я пытаюсь включить.
Я думал, возможно, добавив расширение .erb к 'File.read()' имя файла CSS разрешит его (поскольку он включен в файл, который также является файлом .erb), но это никогда не бывает так просто, не так ли? –
И нельзя использовать 'render()' либо - [см. Этот вопрос] (http://stackoverflow.com/questions/8370399/rails-js-erb-file-cannot-find-method-render) –