Sass-rails helpers "image-url", "asset-url" не работают в рельсах 3.2.1
Я на 3.2.1, с sass-rails-3.2.4 и sass-3.1.15...
Документация для конвейера активов говорит:
asset-url("rails.png", image) becomes url(/assets/rails.png)
image-url("rails.png") becomes url(/assets/rails.png)
...
Итак, я сделал следующий файл:
# app/assets/stylesheets/public/omg.css.sass
body
background: asset-url('snake.gif', image)
#lol
background: image-url('snake.gif')
и когда я посещаю localhost: 3000/assets/public/omg.css, я получаю:
body {
background: asset-url("snake.gif", image); }
#lol {
background: image-url("snake.gif"); }
... Я также попытался изменить файл на omg.css.scss и изменил синтаксис на:
# app/assets/stylesheets/public/omg.css.scss
body {
background: asset-url('snake.gif', image);
}
#lol {
background: image-url('snake.gif');
}
но получайте те же результаты... кто-нибудь знает, почему эти помощники не работают?
Ответы
Ответ 1
Несмотря на то, что говорит документация, кажется, что опции по умолчанию в rails 3.2.6 позволяют вам просто работать с еще меньшей информацией о пути в вашем CSS.
Например. ../app/assets/images/rails.png
- это ссылки в файле example.css.scss с чем-то вроде:
background: white url(rails.png) repeat-y;
Вы не включаете image-url
или asset-url
в свой scss (насколько я знаю), просто url(your_image.png)
. Эта часть документации представляется просто объяснением того, что она делает в фоновом режиме.
Ответ 2
Когда я ударил эту проблему, это произошло потому, что я не включил файл css в конвейер для предварительной компиляции. В результате он будет генерироваться во время выполнения. Поскольку камень sass-rails обычно находится в группе: assets, помощники недоступны при генерации файлов css во время выполнения.
Попробуйте добавить следующую строку к вашему application.rb(или production.rb):
config.assets.precompile += %w( public/omg.css )
Я нашел исправление на этот пост, включая gotcha, именовав файлы при добавлении их в прекомпилятор.
Ответ 3
Если вы обновили приложение до Rails 3.1 в прошлом, убедитесь, что вы изменили файл application.rb с
# If you have a Gemfile, require the gems listed there, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env) if defined?(Bundler)
к
if defined?(Bundler)
# If you precompile assets before deploying to production, use this line
Bundler.require *Rails.groups(:assets => %w(development test))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end
Смотрите этот railscast при обновлении до Rails 3.1 и добавлении конвейера активов.
Обновление: Rails 4 восходит к старому способу его выполнения. Спасибо Аарон Грей!
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env)
Ответ 4
Включили ли вы конвейер активов в application.rb
?
config.assets.enabled = true
Вы сделали правильно, установив расширение на стилях Sass для стилей .css.scss
. Это позволяет Rails знать, чтобы сначала проанализировать файл с Sass, прежде чем он выдает содержимое как CSS.
Ответ 5
Возможно, вы захотите попробовать очистить /tmp/cache. Я слишком новичок в Rails и Sass, чтобы понять, почему это сработало, но я решил эту проблему для меня после нескольких часов поиска.
Кстати, это сработало, несмотря на то, что я мог видеть другие директивы Sass, такие как установка переменных и вычисление с ними, выполнение. Я уверен, что есть очень простое объяснение, как только я успею его отследить.
Ответ 6
Я сделал изменения, предложенные @Ryan, а также обновил sass-rails:
bundle update sass-rails
sass 3.2.6 работал у меня, а 3.2.5 - нет.
Ответ 7
У нас была одна и та же проблема, и я исправил ее, явно требуя звездочек в Gemfile (хотя это зависимость ActionPack):
group :assets do
gem 'sprockets'
gem 'sass-rails', '~> 3.2.3'
# ...
end
Я не знаю почему, но теперь он работает.; -)
Ответ 8
Я несколько дней стучал головой об этом. Единственное решение, которое сработало для меня, было следующим:
- Убедитесь, что sass-rails для вашей группы разработки в вашем Gemfile.
-
Если это не исправить, добавьте следующее в новый файл в config/initializers/, называемый "horrible_sass_patch.rb":
begin
require 'sass-rails'
rescue
end
if Class.const_defined? "Sass::Script::Functions"
module Sass::Script::Functions
# This function exists, but doesn't automatically register
declare :asset_url, [:value]
declare :image_url, [:value]
declare :font_url, [:value]
# ... etc
end
end
Примечание. Для этого требуется, чтобы вы использовали "активный" механизм загрузки Bundler, т.е. ваш application.rb использует следующее:
Bundler.require *Rails.groups(:assets => %w(development test))
... и если ваши таблицы стилей находятся в поставщике, убедитесь, что они включены в конфигурацию Sass:
if config.respond_to? :sass
config.sass.load_paths << Rails.root.join('vendor', 'assets', 'stylesheets')
end