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

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');
}

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

4b9b3361

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