2012-02-16 12 views
45

Sono in 3.2.1, con sass-rails-3.2.4 e sass-3.1.15 ...sass-rails helper "image-url", "asset-url" non funzionano nelle guide 3.2.1

la documentazione per il gasdotto di asset dice:

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

...

così ho fatto il seguente file:

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

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

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

e quando visito localhost: 3000/come insiemi/pubblico/omg.css ottengo:

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

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

... Ho anche provato a cambiare il file omg.css.scss e cambiato la sintassi per:

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

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

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

ma ottenere gli stessi risultati ... qualcuno ha idea del perché questi aiutanti non stiano funzionando?

+2

Hai mai trovato una soluzione per questo? –

+0

Il mio progetto ha 2 fogli di stile (uno per la pagina Web e uno per l'app). Sto avendo questo problema su uno, ma non sull'altro? – Forrest

risposta

30

Nonostante ciò che dice la documentazione, sembra che le opzioni predefinite in rails 3.2.6 ti consentano di far funzionare le cose con meno informazioni sul percorso nel tuo CSS. E.g. ../app/assets/images/rails.png sono riferimenti nel tuo esempio.css.file di SCSS con qualcosa di simile:

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

non si include il image-url o asset-url nella vostra SCSS (per quanto ne so), semplicemente url(your_image.png). Quel pezzetto di documentazione sembra essere solo una spiegazione di ciò che sta facendo in background.

+48

L'uso di solo 'url (rails.png)' non utilizza la versione con impronta digitale del file di asset. Nei nostri file .css.scss, avevamo bisogno di usare 'background: image_url ('my-image.png')'. – dignoe

+8

Se è necessario ottenere l'output dell'impronta digitale, assicurarsi di ** non farlo **: 'rake assets: precompile'. È necessario impostare l'ambiente di produzione, come ad esempio 'RAILS_ENV = asset rake di produzione: precompilare 'altrimenti si genereranno solo i collegamenti delle risorse per la modalità di sviluppo. – cdaloisio

+1

^^ che commento doe !!! Salvato me ORE di mal di testa 'RAILS_ENV = attività di rake di produzione: precompilato' – Mutmatt

4

Hai attivato la pipeline delle risorse in application.rb?

config.assets.enabled = true 

Hai fatto bene impostando l'estensione sui vostri fogli di stile Sass a .css.scss. Ciò consente a Rails di analizzare il file con Sass prima di emettere il contenuto come CSS.

+0

sì ... certo. – patrick

+0

Ho creato un file simile in una posizione simile e ho ottenuto l'output corretto. Hai dei sass-rail nel tuo Gemfile? Puoi aggiornare il tuo post originale con il contenuto di 'config/environments/development.rb'? – Brandan

1

Si potrebbe provare a cancellare/tmp/cache. Sono troppo nuovo per Rails e Sass per sapere perché ha funzionato, ma ho risolto lo stesso problema per me dopo ore di ricerche.

BTW, questo ha funzionato nonostante potessi vedere altre direttive Sass, come impostare variabili e calcolare con esse, in esecuzione. Sono sicuro che c'è una spiegazione molto semplice, una volta che ho il tempo di rintracciarlo.

11

Quando ho riscontrato questo problema, era perché non avevo incluso il file css nella pipeline di asset per la pre-compilazione. Di conseguenza, verrebbe generato in fase di runtime. Poiché la gemma sass-rails si trova comunemente nel gruppo: assets, gli helper non sono disponibili durante la generazione di file css in fase di runtime.

Provate ad aggiungere la seguente riga al application.rb (o production.rb):

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

ho trovato la correzione this post tra cui un Gotcha intorno nominare i file quando li aggiungendo al precompilatore.

0

Abbiamo appena avuto lo stesso problema e ha risolto il tutto richiedendo esplicitamente pignoni nel Gemfile (anche se è una dipendenza di ActionPack):

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

Non so perché, ma ora funziona. ;-)

+1

smart thanks per quello –

6

Se avete aggiornato il vostro app per Rails 3.1 in passato, assicurarsi che hai cambiato il file application.rb da

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

a

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 

Vedere this railscast sull'aggiornamento a Rails 3.1 e aggiungendo la pipeline delle risorse.

Aggiornamento: Rails 4 torna al vecchio modo di farlo. Grazie Aaron Gray!

# Require the gems listed in Gemfile, including any gems 
# you've limited to :test, :development, or :production. 
Bundler.require(:default, Rails.env) 
+4

Una volta che vai su Rails 4, ti consigliamo di tornare al vecchio modo di usare Bundler.require (: default, Rails.env). Vedi http://railscasts.com/episodes/415-upgrading-to-rails-4. –

1

ho fatto il cambiamento suggerito da @ Ryan, così come l'aggiornamento Sass-rails:

bundle update sass-rails 

sass 3.2.6 lavorato per me, mentre 3.2.5 no.

0

Ho battuto la testa contro questo per giorni. L'unica soluzione che ha funzionato per me era la seguente:

  1. Assicurati di avere sass-rail al tuo: gruppo di sviluppo nel tuo Gemfile.
  2. Se questo non risolvere il problema, aggiungere il seguente in un nuovo file in config/inizializzatori/chiamata qualcosa come "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 
    

Nota: Questo richiede che siete utilizzando il meccanismo Bundler loading "attiva", vale a dire la vostra application.rb utilizza il seguente:

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

... e se i vostri fogli di stile sono in vendor, accertarsi che siano inclusi nella configurazione di Sass:

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

Si può solo aggiungere un trailing slash / al percorso e utilizzare url come si fa di solito.

backgound-image: url("/assets/rails.png") 
Problemi correlati