помощники Sass-rails "image-url", "asset-url" не работают в rails 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 / активы / общественность / 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');
}
но получите те же результаты... кто-нибудь знает, почему эти помощники не работают?
9 ответов
несмотря на то, что говорится в документации, кажется, что параметры по умолчанию в rails 3.2.6 позволяют вам просто работать с еще меньшим количеством информации о пути в вашем CSS.
Е. Г. ../app/assets/images/rails.png
ссылки в вашем примере.стиль CSS.файл scss с чем-то вроде:
background: white url(rails.png) repeat-y;
не входит image-url
или asset-url
в ваш scss (насколько я знаю), просто url(your_image.png)
. Этот бит документации, по-видимому, является просто объяснением того, что он делает в фон.
когда я столкнулся с этой проблемой, это было потому, что я не включил файл css в конвейер активов для предварительной компиляции. В результате он будет создан во время выполнения. Поскольку драгоценный камень Sass-rails обычно находится в группе: assets, помощники недоступны при создании файлов css во время выполнения.
попробуйте добавить следующую строку в приложение.РБ (или производство.rb):
config.assets.precompile += %w( public/omg.css )
Я нашел его на этот пост включая gotcha вокруг именования файлы при добавлении их в прекомпилятором.
Если вы обновили приложение до Rails 3.1 в прошлом, убедитесь, что вы изменили свое приложение.файл РБ от
# 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)
to
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)
вы включили конвейер активов в application.rb
?
config.assets.enabled = true
вы правильно сделали, установив расширение на ваших таблицах стилей Sass в .css.scss
. Это позволяет Rails знать, чтобы проанализировать файл с помощью Sass, прежде чем он выдает содержимое как CSS.
вы можете попробовать очистить/tmp / cache. Я слишком новичок в Rails и Sass, чтобы знать, почему это сработало, но он решил ту же проблему для меня после нескольких часов поиска.
кстати, это сработало, несмотря на то, что я мог видеть, как выполняются другие директивы Sass, такие как установка переменных и вычисление с ними. Я уверен, что есть очень простое объяснение, как только я найду его.
Я внес изменения, предложенные @Ryan, а также обновление Sass-rails:
bundle update sass-rails
sass 3.2.6 работал на меня, а 3.2.5-нет.
У нас просто была такая же проблема и исправлена, явно требуя звездочек в Gemfile (хотя это зависимость ActionPack):
group :assets do
gem 'sprockets'
gem 'sass-rails', '~> 3.2.3'
# ...
end
Я не знаю, почему, но это работает сейчас. ;-)
Я бился головой об это в течение нескольких дней. Единственное решение, которое сработало для меня, было следующим:
- убедитесь, что 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, т. е. приложение.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
вы можете просто добавить косую черту /
к пути и используйте url
Как вы обычно делаете.
backgound-image: url("/assets/rails.png")