2012-06-24 3 views
6

Итак, я переработал это приложение с несколькими оболочками, чтобы использовать конвейер активов, введенный в 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 Я пытаюсь включить.

+0

Я думал, возможно, добавив расширение .erb к 'File.read()' имя файла CSS разрешит его (поскольку он включен в файл, который также является файлом .erb), но это никогда не бывает так просто, не так ли? –

+0

И нельзя использовать 'render()' либо - [см. Этот вопрос] (http://stackoverflow.com/questions/8370399/rails-js-erb-file-cannot-find-method-render) –

ответ

5

Хорошо, после нескольких часов поиска я натолкнулся на the list of available helper methods in Sprockets - это бы сэкономило мне много времени, если бы это было связано с the Sprockets man page на GitHub (есть ссылка, но она указывает на #FIXME). Из API Docs Звездочки:

  • (Object) evaluate(path, options = {})
  • Читает path и запускает процессоры на файл.
  • Это позволяет вам фиксировать результат актива и включать его непосредственно в другой.
  • <%= evaluate "bar.js" %>

Бинго! Я изменил мой включить директиву:

<%= evaluate(Rails.root.join("app/assets/some_other_identity/stylesheets/overrides.css.erb")) %> 

и CSS, обрабатывается и вставить результаты, именно так, как я хотел, чтобы работать.

+0

Спасибо для справки, помог мне. –

 Смежные вопросы

  • Нет связанных вопросов^_^