Подтвердить что ты не робот

CSS?

Я работаю над приложением Rails 3.1. Я создал файл application.css.scss.erb. В конце концов .erb, потому что я хочу загрузить переменную из файла конфигурации в качестве цветовой переменной в css:

$highlight1: #<%= COLOR.highlight1 %>;
$highlight2: #<%= COLOR.highlight2 %>;

Все работает отлично, но проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я изменяю значение внутри COLOR.highlight1, оно не отражает изменения, пока я не войду в свой файл css и не изменю что-то (я обычно добавляю некоторые пробелы и сохрани это). То, когда я вижу изменение. Ясно, что рельсы ищут, был ли файл изменен, чтобы обновить изменение.

Есть ли способ, по крайней мере, во время разработки, это можно отключить, и я могу видеть изменения без необходимости изменять файл css?

Любая критика/мнения по моей технике также приветствуются

4b9b3361

Ответ 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;
}