помощники 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

Я не знаю, почему, но это работает сейчас. ;-)


Я бился головой об это в течение нескольких дней. Единственное решение, которое сработало для меня, было следующим:

  1. убедитесь, что Sass-rails для вашей: группы разработки в вашем Gemfile.
  2. Если это не исправит его, добавьте следующее в новый файл в 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")