les helpers Sass-rails "image-url", "asset-url" ne fonctionnent pas dans les rails 3.2.1
je suis sur 3.2.1, avec sass-rails-3.2.4 et sass-3.1.15...
La documentation de l'asset pipeline dit:
asset-url("rails.png", image) becomes url(/assets/rails.png)
image-url("rails.png") becomes url(/assets/rails.png)
...
j'ai Donc fait 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 j'obtiens:
body {
background: asset-url("snake.gif", image); }
#lol {
background: image-url("snake.gif"); }
... J'ai aussi essayé de changer le fichier omg.CSS.scss et changé la syntaxe:
# app/assets/stylesheets/public/omg.css.scss
body {
background: asset-url('snake.gif', image);
}
#lol {
background: image-url('snake.gif');
}
mais d'obtenir les mêmes résultats... quelqu'un a une idée de pourquoi ces les aides ne travaillent pas?
9 réponses
malgré ce que dit la documentation, il semble que les options par défaut dans les rails 3.2.6 vous permettent de faire fonctionner les choses avec encore moins d'informations de chemin dans votre CSS.
E. g. ../app/assets/images/rails.png
références dans votre exemple.CSS.fichier scss avec quelque chose comme:
background: white url(rails.png) repeat-y;
Vous n'incluez pas l' image-url
ou asset-url
dans votre scss (autant que je sache), tout simplement url(your_image.png)
. Le peu de documentation semble être juste une explication de ce qu'il fait en arrière-plan.
quand j'ai eu ce problème, c'était parce que je n'avais pas inclus le fichier css dans le pipeline de l'actif pour la pré-compilation. En conséquence, il serait généré à l'exécution. Parce que le gem sass-rails est souvent dans le groupe :assets, les helpers ne sont pas disponibles lors de la génération de fichiers css à l'exécution.
Essayez d'ajouter la ligne suivante à votre application.rb (ou de la production.rb):
config.assets.precompile += %w( public/omg.css )
j'ai trouvé la solution sur ce post y compris un gotcha autour du nom du fichiers lors de leur ajout au pré-compilateur.
Si vous avez mis à jour votre application Rails 3.1, dans le passé, assurez-vous que vous avez changé votre application.rb le fichier 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 c'railscast sur la mise à niveau vers les Rails 3.1 et l'ajout du pipeline d'actifs.
mise à Jour: les Rails 4 reprennent l'ancienne façon de faire. 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 en positionnant l'extension sur vos feuilles de style Sass à .css.scss
. Cela permet à Rails de savoir analyser le fichier avec Sass avant qu'il n'émette le contenu sous forme de CSS.
vous pouvez essayer de nettoyer/tmp / cache. Je suis trop nouveau à Rails et Sass pour savoir pourquoi cela a fonctionné, mais il a résolu le même problème pour moi après des heures de recherche.
BTW, cela a fonctionné malgré le fait que j'ai pu voir d'autres directives Sass, comme définir des variables et calculer avec elles, être exécutées. Je suis sûr qu'il y a une explication très simple, une fois que j'ai le temps de la retrouver.
j'ai fait le changement suggéré par @Ryan, ainsi que la mise à niveau Sass-rails:
bundle update sass-rails
sass 3.2.6 a fonctionné pour moi, alors que 3.2.5 ne l'a pas fait.
nous avons juste eu le même problème et l'avons corrigé en exigeant explicitement sprockets dans le Gemfile (même si c'est une dépendance D'ActionPack):
group :assets do
gem 'sprockets'
gem 'sass-rails', '~> 3.2.3'
# ...
end
je ne sais pas pourquoi, mais ça fonctionne maintenant. ; -)
je me cogne la tête contre ça depuis des jours. La seule solution qui a fonctionné pour moi était la suivante:
- assurez-vous Sass-rails à votre :groupe de développement dans votre Gemfile.
si cela ne le corrige pas, ajoutez ce qui suit à 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
Note: cela nécessite que vous utilisiez le mécanisme de chargement du Bundler" actif", c'est-à-dire votre application.rb utilise ce qui suit:
Bundler.require *Rails.groups(:assets => %w(development test))
... et si vos feuilles de style sont dans le vendeur, 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
vous pouvez juste ajouter un slash arrière/
pour le chemin d'accès et d'utilisation url
comme vous le faites habituellement.
backgound-image: url("/assets/rails.png")