CSS?
Я работаю над приложением Rails 3.1. Я создал файл application.css.scss.erb
. В конце концов .erb, потому что я хочу загрузить переменную из файла конфигурации в качестве цветовой переменной в css:
$highlight1: #<%= COLOR.highlight1 %>;
$highlight2: #<%= COLOR.highlight2 %>;
Все работает отлично, но проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я изменяю значение внутри COLOR.highlight1, оно не отражает изменения, пока я не войду в свой файл css и не изменю что-то (я обычно добавляю некоторые пробелы и сохрани это). То, когда я вижу изменение. Ясно, что рельсы ищут, был ли файл изменен, чтобы обновить изменение.
Есть ли способ, по крайней мере, во время разработки, это можно отключить, и я могу видеть изменения без необходимости изменять файл css?
Любая критика/мнения по моей технике также приветствуются
Ответы
Ответ 1
Директива Sprockets depend_on
используется для объявления этих зависимостей. Итак, в верхней части вашего файла css.scss.erb, с другими директивами (require and friends), поставьте что-то вроде:
//= depend_on "/path/to/colors.rb"
Затем, когда изменяется файл /path/to/colors.rb
, он также заставит css обновляться.
К сожалению, мне никогда не приходилось работать с относительным путем к файлу за пределами одного из каталогов ресурсов (javascripts/stylesheets/images), так что может быть что-то в том, как Sprockets разрешает пути, которые мешают этому, иначе Я что-то упускаю. Это дает вам возможность указывать абсолютный путь, который почти наверняка не будет работать во всех средах приложений или помещает файл констант в ваши каталоги активов (например, app/assets/stylesheets/colors.rb).
Для справки, здесь doc для директивы depend_on
из источника Sprockets (2.0.3), в sprockets/directive_processor.rb
# Allows you to state a dependency on a file without
# including it.
#
# This is used for caching purposes. Any changes made to
# the dependency file will invalidate the cache of the
# source file.
#
# This is useful if you are using ERB and File.read to pull
# in contents from another file.
#
# //= depend_on "foo.png"
#
Если кто-то знает способ указать относительные пути к другим местам, таким как config/initializers или что-то еще, сообщите мне!
Ответ 2
В дополнение к ответу Дэвида Фабера. Мне также нужно было использовать относительные пути.
Я хотел создать файл js с помощью словаря locale, который будет обновляться, если файлы локали были изменены:
//= depend_on "../../../config/locales/en.yml"
//= depend_on "../../../config/locales/ja.yml"
var locales = <%= locales.to_json %>;
Оказывается, относительные пути в настоящий момент (Rails 3.2.3) работают только в том случае, если относительный путь также находится в пути к ресурсам!
Таким образом, уродливое решение заключается в добавлении пути в config/application.rb
:
config.assets.paths.unshift Rails.root.join("config", "locales").to_s
Ответ 3
возможно, попробуйте:
config.assets.digest = true
в файле конфигурации разработки
Ответ 4
http://guides.rubyonrails.org/configuring.html
- config.assets.compile - это логическое значение, которое может быть использовано для включения компиляции Live Sprockets в процессе производства.
возможно, захочет попробовать, я не уверен, что если он собирает в реальном времени, хотя, по крайней мере, он должен отключить кеширование.
Ответ 5
Я пробую это, он работает
в application.rb
config.autoload_paths += %W(#{config.root}/lib/assets_variables)
config.assets.paths << File.join(Rails.root, 'lib', 'assets_variables')
в lib/assets_variables/color.rb
module Color
def self.default
'blue'
end
end
в app/assets/stylesheets/color.css.scss.erb
//= depend_on "color.rb"
$default_color: <%= Color::default %>;
.content {
color: $default_color;
}