Je suis sur 3.2.1, avec sass-Rails-3.2.4 et sass-3.1.15 ...
La documentation du pipeline d’actifs indique:
asset-url("Rails.png", image) becomes url(/assets/Rails.png)
image-url("Rails.png") becomes url(/assets/Rails.png)
...
J'ai donc créé le fichier suivant:
# app/assets/stylesheets/public/omg.css.sass
body
background: asset-url('snake.gif', image)
#lol
background: image-url('snake.gif')
et quand je visite localhost: 3000/assets/public/omg.css je reçois:
body {
background: asset-url("snake.gif", image); }
#lol {
background: image-url("snake.gif"); }
... J'ai aussi essayé de changer le fichier en omg.css.scss et de changer la syntaxe en:
# app/assets/stylesheets/public/omg.css.scss
body {
background: asset-url('snake.gif', image);
}
#lol {
background: image-url('snake.gif');
}
mais obtenez les mêmes résultats… Quelqu'un sait-il pourquoi ces aides ne fonctionnent pas?
Lorsque j'ai rencontré ce problème, c'est parce que je n'avais pas inclus le fichier CSS dans le pipeline d'actifs pour la pré-compilation. En conséquence, il serait généré au moment de l'exécution. Comme la gem sass-Rails se trouve généralement dans le groupe: assets, les aides ne sont pas disponibles lors de la génération de fichiers CSS au moment de l'exécution.
Essayez d’ajouter la ligne suivante à votre application.rb (ou production.rb):
config.assets.precompile += %w( public/omg.css )
J'ai trouvé le correctif sur ce post , y compris un problème de nommer les fichiers lors de leur ajout au précompilateur.
Si vous avez mis à jour votre application vers Rails 3.1 par le passé, assurez-vous d'avoir modifié le fichier application.rb de
# 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
Voir ce railcast lors de la mise à niveau vers Rails 3.1 et de l’ajout du pipeline d’actifs.
Mise à jour: Rails 4 revient à l'ancienne façon de procéder. Merci Aaron Gray!
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(:default, Rails.env)
Avez-vous activé le pipeline d’actifs dans application.rb
?
config.assets.enabled = true
Vous avez bien fait de définir l’extension de vos feuilles de style Sass sur .css.scss
. Cela permet à Rails de commencer par analyser le fichier avec Sass avant qu’il n’émette le contenu en tant que CSS.
Vous voudrez peut-être essayer d'effacer/tmp/cache. Je suis trop nouveau pour Rails et Sass pour savoir pourquoi cela a fonctionné, mais cela a résolu le même problème après des heures de recherche.
BTW, cela a fonctionné malgré le fait que je pouvais voir d’autres directives Sass, telles que la définition de variables et le calcul associé, exécutées. Je suis sûr qu'il existe une explication très simple, une fois que j'ai le temps de la retrouver.
J'ai apporté le changement suggéré par @Ryan, ainsi que la mise à niveau de sass-Rails:
bundle update sass-Rails
sass 3.2.6 a fonctionné pour moi, alors que 3.2.5 ne l’a pas été.
Nous avons juste eu le même problème et l'avons corrigé en demandant explicitement des pignons dans le Gemfile (même s'il s'agit d'une dépendance d'ActionPack):
group :assets do
gem 'sprockets'
gem 'sass-Rails', '~> 3.2.3'
# ...
end
Je ne sais pas pourquoi, mais ça marche maintenant. ;-)
Je me frappe la tête contre cela depuis des jours. La seule solution qui a fonctionné pour moi était la suivante:
Si cela ne résout pas le problème, ajoutez ce qui suit dans un nouveau fichier dans config/initializers/appelé quelque chose comme "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
Remarque: Ceci nécessite que vous utilisiez le mécanisme de chargement "actif" de Bundler, c’est-à-dire que votre application.rb utilise les éléments suivants:
Bundler.require *Rails.groups(:assets => %w(development test))
... et si vos feuilles de style appartiennent au fournisseur, assurez-vous qu'elles sont incluses dans la configuration de Sass:
if config.respond_to? :sass
config.sass.load_paths << Rails.root.join('vendor', 'assets', 'stylesheets')
end