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?

45
demandé sur New Alexandria 2012-02-16 06:20:23

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.

33
répondu Jay H. 2012-08-05 19:05:13

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.

11
répondu Forrest 2012-04-12 14:44:18

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)
6
répondu Ryan 2014-02-03 18:55:19

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.

4
répondu Brandan 2012-02-16 02:39:55

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.

1
répondu kburke 2012-04-10 17:32:40

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.

1
répondu Steve 2013-03-01 16:52:55

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. ; -)

0
répondu iGEL 2012-07-11 09:13:42

je me cogne la tête contre ça depuis des jours. La seule solution qui a fonctionné pour moi était la suivante:

  1. assurez-vous Sass-rails à votre :groupe de développement dans votre Gemfile.
  2. 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
0
répondu user208769 2016-06-02 19:17:09

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")
0
répondu user3284463 2018-02-10 11:33:54