it-swarm.com.de

sass-Rails-Helfer "image-url", "asset-url" funktionieren nicht in Rails 3.2.1

Ich bin am 3.2.1, mit sass-Rails-3.2.4 und sass-3.1.15 ...

Die Dokumentation für die Asset-Pipeline lautet:

asset-url("Rails.png", image) becomes url(/assets/Rails.png)
image-url("Rails.png") becomes url(/assets/Rails.png)

...

Also habe ich folgende Datei gemacht:

# app/assets/stylesheets/public/omg.css.sass

body
  background: asset-url('snake.gif', image)

#lol
  background: image-url('snake.gif')

und wenn ich localhost besuche: 3000/assets/public/omg.css bekomme ich:

body {
  background: asset-url("snake.gif", image); }

#lol {
  background: image-url("snake.gif"); }

... Ich habe auch versucht, die Datei in omg.css.scss zu ändern, und die Syntax geändert in

# app/assets/stylesheets/public/omg.css.scss

body {
  background: asset-url('snake.gif', image);
}

#lol {
  background: image-url('snake.gif');
}

aber die gleichen Ergebnisse erzielen ... hat jemand eine Ahnung, warum diese Helfer nicht funktionieren?

45
patrick

Ungeachtet der Angaben in der Dokumentation scheinen die Standardoptionen in Rails 3.2.6 es Ihnen zu ermöglichen, Dinge mit noch weniger Pfadinformationen in Ihrem CSS zum Laufen zu bringen. Z.B. ../app/assets/images/Rails.png enthält Verweise in Ihrer example.css.scss-Datei mit etwa:

background: white url(Rails.png) repeat-y;

Du fügst den image-url oder asset-url (soweit ich weiß) nicht in deinen scss ein, sondern einfach url(your_image.png). Diese Dokumentation scheint nur eine Erklärung dafür zu sein, was sie im Hintergrund tut.

33
Jay H.

Als ich dieses Problem traf, lag es daran, dass ich die CSS-Datei nicht in die Asset-Pipeline zur Vorbereitung der Kompilierung aufgenommen hatte. Infolgedessen würde es zur Laufzeit generiert. Da sich der Sass-Rails-Edelstein häufig in der Gruppe: Assets befindet, stehen die Helfer nicht zur Verfügung, wenn CSS-Dateien zur Laufzeit generiert werden.

Fügen Sie der application.rb (oder production.rb) die folgende Zeile hinzu:

config.assets.precompile += %w( public/omg.css )

Ich habe das Update in diesem Beitrag gefunden, einschließlich eines Gotcha-Namens, um die Dateien beim Hinzufügen zum Precompiler umzubenennen.

11
Forrest

Wenn Sie Ihre App in der Vergangenheit auf Rails 3.1 aktualisiert haben, stellen Sie sicher, dass Sie Ihre Datei application.rb in geändert haben

# 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)

zu

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

Siehe this railcast zum Upgrade auf Rails 3.1 und zum Hinzufügen der Asset-Pipeline.

Update: Rails 4 geht auf die alte Art und Weise zurück. Vielen Dank 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

Haben Sie die Asset-Pipeline in application.rb aktiviert?

config.assets.enabled = true

Sie haben es richtig gemacht, indem Sie die Erweiterung Ihrer Sass-Stylesheets auf .css.scss setzen. Dadurch kann Rails die Datei zuerst mit Sass analysieren, bevor der Inhalt als CSS ausgegeben wird.

4
Brandan

Möglicherweise möchten Sie versuchen,/tmp/cache zu löschen. Ich bin bei Rails und Sass noch zu neu, um zu wissen, warum dies funktioniert hat, aber es löste dasselbe Problem nach stundenlangem Suchen.

Übrigens, das funktionierte trotz der Tatsache, dass ich andere Sass-Anweisungen sehen konnte, wie das Setzen von Variablen und das Rechnen damit. Ich bin mir sicher, dass es eine sehr einfache Erklärung gibt, sobald ich Zeit habe, sie aufzuspüren.

1
kburke

Ich habe die von @Ryan vorgeschlagene Änderung vorgenommen und Sass-Rails aufgerüstet:

bundle update sass-Rails

sass 3.2.6 arbeitete für mich, während 3.2.5 nicht arbeitete.

1
Steve

Wir hatten das gleiche Problem und haben es behoben, indem explizit Kettenräder in der Gemfile angefordert wurden (obwohl dies eine Abhängigkeit von ActionPack ist):

group :assets do
  gem 'sprockets'
  gem 'sass-Rails', '~> 3.2.3'
  # ...
end

Ich weiß nicht warum, aber es funktioniert jetzt. ;-)

0
iGEL

Ich habe seit Tagen meinen Kopf dagegen geschlagen. Die einzige Lösung, die für mich funktioniert hat, war folgende:

  1. Stellen Sie sicher, dass sass-Rails zu Ihrer: Entwicklungsgruppe in Ihrem Gemfile gehört. 
  2. Wenn dies nicht behoben werden kann, fügen Sie einer neuen Datei in config/initializers/Folgendes hinzu: "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
    

Hinweis: Dies setzt voraus, dass Sie den "aktiven" Bundler-Lademechanismus verwenden, d. H. Ihre application.rb verwendet Folgendes:

Bundler.require *Rails.groups(:assets => %w(development test))

... und wenn Ihre Stylesheets vom Hersteller stammen, stellen Sie sicher, dass sie in der Konfiguration von Sass enthalten sind:

if config.respond_to? :sass
  config.sass.load_paths << Rails.root.join('vendor', 'assets', 'stylesheets')
end
0
user208769