Компиляция Sass с пользовательскими переменными для каждого запроса под Rails 3.1 - PullRequest
3 голосов
/ 04 декабря 2011

В приложении на Rails 3.1 одному контроллеру необходимо, чтобы все его представления компилировались с любыми таблицами стилей Sass, которые им могут понадобиться для каждого запроса, используя набор пользовательских переменных. В идеале компиляция должна происходить через конвейер ресурсов, чтобы генерировались имена ресурсов на основе контента (те, которые содержат хэш контента MD5). Для решения важно использовать возможности чистого Sass, а не прибегать, например, к обработке ERB таблиц стилей Sass.

Из исследований, которые я провел здесь и в других местах, следующий подход кажется возможным:

  1. Настройка доступа к переменной

    • Создайте некоторый тип моста доступа к переменной с помощью пользовательских функций Sass, например, как описано Константин Хаазе здесь ( gist ). Это кажется довольно простым.

    • Сконфигурируйте доступ ко всем переменным через парциальную часть Sass, например, в _base.sass, что является способом Compass. Частичное может использовать пользовательские функции, определенные выше. Также легко.

  2. Захват всех ссылок на активы

    • Украсить метод asset_path объекта просмотра. У меня это работает хорошо.

    • Разрешить ссылки, используя пользовательский подкласс Sprockets::Environment. Это тоже хорошо работает.

  3. Принудительная перекомпиляция ресурсов независимо от времени модификации файла

    • Я не нашел хорошего решения для этого.

    • Я видел примеры запуска обработки Sass вручную путем создания нового Sass::Engine и передачи пользовательских данных, которые будут доступны в Sass::Script::Functions::EvaluationContext. Проблема с этим подходом заключается в том, что мне придется самостоятельно управлять именами файлов и путями, и я всегда рискую отклониться от того, что делает Sprockets.

    • Мне не удалось найти примеры принудительной обработки Sprockets для каждого запроса независимо от времени модификации файла, что также позволяет передавать пользовательские переменные.

Буду признателен за комментарии по общему подходу, а также за любые конкретные указания / предложения о том, как лучше всего справляться (3).

Ответы [ 2 ]

1 голос
/ 11 июля 2012

Sim.

Это возможно. Смотрите здесь SASS: установка переменной во время компиляции

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

1 голос
/ 05 декабря 2011

SASS предназначен для предварительной компиляции в CSS. Использование Sprockets для каждого запроса представления для каждого запроса не будет работать очень хорошо. Каждый запрос должен ждать завершения компиляции, и он не быстрый (с точки зрения страниц обслуживания).

Генерация MD5 находится внутри Sprockets, поэтому, если вы изменяете пользовательские переменные, вам придется принудительно компилировать каждый отдельный запрос, чтобы убедиться, что изменения видны, потому что представление (вероятно) не будет знать.

Звучит так, как будто это на самом деле не самое лучшее место для конвейера ресурсов, и вам стоит взглянуть на что-то более оптимизированное для действительно динамического CSS.

Извините. : -)

...