Динамический (и) CSS в rails 3.1

#ruby-on-rails #asset-pipeline #sass

#ruby-on-rails #конвейер активов #sass

Вопрос:

Я пытаюсь разрешить пользователю настраивать мое приложение с помощью файлов YML.
Когда пользователь обновляет определенные вещи, CSS также необходимо обновить.

Я бы хотел решить эту проблему, используя вместо этого динамический CSS. То, как я планировал это сделать, — это иметь SCSS-файл настроек, который импортируют и используют другие файлы css.

Вот что у меня есть до сих пор:

settings.scss.erb:

 $width: <%= Rails.application.config.width %>px;
  

main.css.scss:

 //= require settings

@import "settings";

#main {
  width: $width;
}
  

Но я получаю эту ошибку:

 Invalid CSS after "$width: ": expected expression (e.g. 1px, bold), was "<%= Rails.appli..."`
  

Итак, кажется, что настройки не передаются через анализатор erb перед передачей в анализатор SCSS, есть ли какой-либо способ решить эту проблему.

Я бы предпочел не помещать все в .erb файлы, поскольку мой текстовый редактор не поддерживает (подсветку синтаксиса и команды) при наличии scss в файлах erb

Комментарии:

1. Под пользователем вы подразумеваете пользователя приложения (профиль) или разработчика приложений, который размещает его на сервере?

2. Deployer, поэтому после создания ресурсов они не будут сгенерированы снова (если вы не измените настройки)

Ответ №1:

Проблема, при которой ERB не анализируется, вы не сможете динамически настраивать CSS (я думаю, что для основного файла может потребоваться расширение erb). Конвейер активов предназначен для обслуживания ресурсов таким образом, чтобы сообщать браузерам, что они статичны и не будут меняться.

Предполагая, что синтаксический анализ erb работает, ширина будет отображаться на этапе предварительной компиляции или по первому запросу. Если вы используете звездочки, заголовки far-future настроены так, чтобы сообщать удаленным клиентам кэшировать содержимое в течение 1 года. И Sprockets улавливает изменения только в том случае, если изменяется временная метка файла, поэтому никогда не получит никаких новых значений.

Вы могли бы заставить Sprockets динамически обслуживать каждый запрос и не отправлять никаких заголовков, но на самом деле он не предназначен для этого, и при этом возникают значительные риски для производительности.

Комментарии:

1. Он не будет динамичным в том смысле, что он отличается от запроса к запросу, просто от настройки к настройке. Один человек может захотеть, чтобы объект имел ширину 500 пикселей, другой может захотеть 1000 пикселей, но ресурсы необходимо будет восстановить, если вы обновите настройки.