web-dev-qa-db-fra.com

les aides sass-Rails "image-url", "asset-url" ne fonctionnent pas dans Rails 3.2.1

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?

45
patrick

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.

11
Forrest

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)
6
Ryan

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.

4
Brandan

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.

1
kburke

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é.

1
Steve

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

0
iGEL

Je me frappe la tête contre cela depuis des jours. La seule solution qui a fonctionné pour moi était la suivante:

  1. Assurez-vous que votre groupe de développement dispose de sass-Rails dans votre Gemfile. 
  2. 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
0
user208769