помощники sass-rails "image-url", "asset-url" не работают в rails 3.2.1 - PullRequest
45 голосов
/ 16 февраля 2012

Я использую 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');
}

, но получил те же результаты ... Кто-нибудь знает, почему эти помощники не являютсярабочий?

Ответы [ 9 ]

33 голосов
/ 05 августа 2012

Несмотря на то, что написано в документации, кажется, что опции по умолчанию в 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). Этот фрагмент документации, кажется, просто объясняет, что он делает в фоновом режиме.

11 голосов
/ 12 апреля 2012

Когда я столкнулся с этой проблемой, это было потому, что я не включил файл css в конвейер ресурсов для предварительной компиляции. В результате он будет сгенерирован во время выполнения. Поскольку гем sass-rails обычно находится в группе: assets, помощники недоступны при генерации CSS-файлов во время выполнения.

Попробуйте добавить следующую строку в ваш application.rb (или production.rb):

config.assets.precompile += %w( public/omg.css )

Я нашел исправление в этом посте , включая хитрость при именовании файлов при добавлении их в прекомпилятор.

6 голосов
/ 07 февраля 2013

Если вы ранее обновляли свое приложение до 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 голосов
/ 16 февраля 2012

Вы включили конвейер активов в application.rb?

config.assets.enabled = true

Вы правильно сделали, установив расширение на ваших таблицах стилей Sass на .css.scss. Это позволяет Rails знать, что нужно проанализировать файл с помощью Sass, прежде чем он выдаст содержимое в виде CSS.

1 голос
/ 01 марта 2013

Я внес изменения, предложенные @Ryan, а также обновил sass-rails:

bundle update sass-rails

sass 3.2.6 работал для меня, а 3.2.5 - нет.

1 голос
/ 10 апреля 2012

Вы можете попробовать очистить / tmp / cache. Я слишком новичок в Rails и Sass, чтобы знать, почему это сработало, но после нескольких часов поиска я решил ту же проблему.

Кстати, это сработало, несмотря на то, что я мог видеть выполнение других директив Sass, таких как установка переменных и их вычисление. Я уверен, что есть очень простое объяснение, как только у меня будет время выследить его.

0 голосов
/ 10 февраля 2018

Вы можете просто добавить косую черту / к пути и использовать url, как обычно.

background-image: url("/assets/rails.png")
0 голосов
/ 02 июня 2016

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

  1. Убедитесь, что sass-rails для вашей группы разработчиков в вашем Gemfile.
  2. Если это не помогает, добавьте следующее в новый файл в config / initializer /, называемый что-то вроде «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
0 голосов
/ 11 июля 2012

У нас была та же проблема, и мы решили ее, явно потребовав звездочки в Gemfile (даже если это зависимость от ActionPack):

group :assets do
  gem 'sprockets'
  gem 'sass-rails', '~> 3.2.3'
  # ...
end

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

...