rails 3.1.0 ActionView :: Template :: Error (application.css non è precompilato)


281

Ho creato un'app di rotaie di base con un semplice controller di pagine con una funzione di indice e quando carico la pagina ottengo:

ActionView::Template::Error (application.css isn't precompiled):
    2: <html>
    3: <head>
    4:   <title>Demo</title>
    5:   <%= stylesheet_link_tag    "application" %>
    6:   <%= javascript_include_tag "application" %>
    7:   <%= csrf_meta_tags %>
    8: </head>
  app/views/layouts/application.html.erb:5:in `_app_views_layouts_application_html_erb__43625033_88530400'

Gemfile

source 'http://rubygems.org'

gem 'rails', '3.1.0'

# Bundle edge Rails instead:
# gem 'rails',     :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'

gem 'execjs'
gem 'therubyracer'

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails', "  ~> 3.1.0"
  gem 'coffee-rails', "~> 3.1.0"
  gem 'uglifier'
end

gem 'jquery-rails'

# Use unicorn as the web server
# gem 'unicorn'

# Deploy with Capistrano
# gem 'capistrano'

# To use debugger
# gem 'ruby-debug19', :require => 'ruby-debug'

group :test do
  # Pretty printed test output
  gem 'turn', :require => false
end

7
bundle exec rake assets: precompile sembra risolverlo, ma perché non funziona?
Chris Muench,

10
Ho lo stesso problema in produzione, anche dopo l'esecuzione del bundle exec rake asset: precompile
Lucas Renan,

Risposte:


313

Per impostazione predefinita, Rails presuppone che i file siano precompilati nell'ambiente di produzione, se si desidera utilizzare la compilazione live (compilare le risorse durante il runtime) in produzione, è necessario impostare il file config.assets.com su true .

# config/environments/production.rb
...
config.assets.compile = true
...

È possibile utilizzare questa opzione per eseguire il fallback su Sprocket quando si utilizzano risorse precompilate ma sono presenti file precompilati mancanti.

Se l' config.assets.compileopzione è impostata su false e mancano i file precompilati, verrà visualizzato un "AssetNoPrecompiledError" che indica il nome del file mancante.


3
Potresti provare cosa dice questo articolo: devcenter.heroku.com/articles/rails31_heroku_cedar (non l'ho ancora provato da solo)
Chris Muench,

7
Giusto per essere chiari, l'opzione config.assets.compile è in config / ambienti / production.rb (se stai lavorando in produzione). E se vuoi essere in grado di eseguire la compilazione live / lazy in produzione, devi anche abilitare la compilazione lazy in application.rb.
avioing

34
L'attivazione della compilazione di runtime non è la soluzione, a causa dell'hit di performance che subiamo. La soluzione è risolvere il problema principale che impedisce la precompilazione delle risorse.
David Tuite,

5
Ho precompilato gli asset usando RAILS_ENV = bundle di produzione exec rake assets: precompile. Perché visualizzo questo errore e ho bisogno di impostare anche questo flag?
Tony,

2
@Tony, perché probabilmente chiedi qualcosa di diverso dal file application.css / js / image e non l'hai registrato application.rb. Aggiungere / modificare application.rb: config.assets.precompile += %w( first.css second.js ). Ora verranno compilati anche questi file. Non aggiungere tutti i file se li usi solo nei pignoni require, ma solo se li includi con <link>/<script>
elado

202

Otterrai prestazioni migliori in produzione se imposti config.assets.compile su false in production.rb e precompili le tue risorse. È possibile precompilare con questa attività rake:

bundle exec rake assets:precompile

Se stai usando Capistrano, la versione 2.8.0 ha una ricetta per gestirla al momento della distribuzione. Per ulteriori informazioni, consultare la sezione "In produzione" della Guida alla pipeline degli asset: http://guides.rubyonrails.org/asset_pipeline.html


14
Non riesco a credere quanto sia stato difficile scoprire come farlo.
Derekerdmann,

3
Questa sembra l'opzione chiaramente migliore: impostare la compilazione live su true "utilizza più memoria, esegue in modo più scadente rispetto al valore predefinito e non è consigliabile." guide.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell

rake -To bundle exec rake -Tè tuo amico.
Ryan,

2
@Underworld Bundler è uno strumento per la gestione delle dipendenze gemma in un'app ruby ​​ed è integrato in Rails 3. Se stai usando il bundler, l'esecuzione bundle exec rake ...assicurerà che stai caricando il rake giusto e le dipendenze associate per la tua app. Se non si utilizza il bundler, si eseguirà semplicemente rake ....
richardsun,

3
Se eseguirai il comando precedente, assicurati di aver già impostato il tuo ambiente in modalità di produzione, oppure aggiungi il prefisso RAILS_ENV = production
JESii

31

OK - Ho avuto lo stesso problema. Non volevo usare "config.assets.compile = true" - Ho dovuto aggiungere tutti i miei file .css all'elenco in config / environment / production.rb:

config.assets.precompile += %w( carts.css )

Quindi ho dovuto creare (e successivamente eliminare) tmp / restart.txt

Ho costantemente utilizzato l'helper stylesheet_link_tag, quindi ho trovato tutti i file CSS aggiuntivi che dovevo aggiungere con:

find . \( -type f -o -type l \) -exec grep stylesheet_link_tag {} /dev/null \;

Se si utilizzano query multimediali e file CSS diversi per risoluzioni diverse, questo è il modo migliore per procedere.
Fa11en Angel

1
Devo includere tutti i miei file CSS nell'array? Cosa succede se ho 40 file CSS?
yozzz,

30

Una soluzione rapida per l'utente capistrano è quella di mettere questa linea su Capfile

# Uncomment if you are using Rails' asset pipeline
load 'deploy/assets'

11

Per tutti coloro che stanno leggendo questo ma non hanno problemi con application.csse invece con le loro classi CSS personalizzate, ad es admin.css.base.css ecc.

La soluzione è usare come detto

bundle exec rake assets:precompile

E nei fogli di riferimento i riferimenti sono solo riferimenti application.css

<%= stylesheet_link_tag    "application", :media => "all" %>

Poiché la pipeline delle risorse precompilerà tutti i tuoi fogli di stile in application.css. Ciò accade anche nello sviluppo, quindi l'utilizzo di qualsiasi altro riferimento è errato quando si utilizza la pipeline delle risorse.


8

Stavo avendo lo stesso errore nel mio ambiente di sviluppo. Alla fine tutto quello che dovevo fare per sistemarlo era aggiungere:

config.assets.manifest = Rails.root.join("public/assets")

nel mio file config / environment / development.rb e lo ha riparato. La mia configurazione finale nello sviluppo relativa alle risorse è simile a:

config.assets.compress = false  
config.assets.precompile += %w[bootstrap-alerts.js] #Lots of other space separated files
config.assets.compile = false
config.assets.digest = true
config.assets.manifest = Rails.root.join("public/assets")
config.assets.debug = true

Questa è stata l'unica soluzione che ha funzionato per me. Forse è stato un problema con la mia versione di Rails (3.1.3)? Ad ogni modo, potrei dire che i miei beni sono stati precompilati con successo in pubblico / beni e i loro nomi di file avevano gli stessi SHA elencati in manifest.yml. Per qualche ragione, Rails non era più alla ricerca di risorse nel posto giusto, anche se la mia configurazione aveva sempre funzionato bene in precedenza. Questa modifica lo ha risolto.
antinome,

Grazie per questa soluzione Stavo cercando di testare alcune cose in modalità di sviluppo e sono rimasto sorpreso dal fatto che dicesse "application.css non è precompilato" anche se avevo già precompilato asset e public / assets / application.css era presente nella directory. Sorpresi che non impostino config.assets.manifest automaticamente per te in fase di sviluppo come fanno in produzione ..
Tyler Rick,

5

Ho anche avuto questo problema, in cui il tentativo di essere eseguito in produzione senza precompilare genererebbe comunque errori non precompilati. Ho dovuto cambiare quale riga è stata commentata application.rb:

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

2
Voglio solo chiarire per chiunque si imbatterà più tardi in questo, il codice che devi cambiare sopra si trova inconfig/application.rb
GMA

4

Ecco la soluzione rapida:

Se stai usando capistrano, aggiungi questo al tuo deploy.rb:

after 'deploy:update_code' do
  run "cd #{release_path}; RAILS_ENV=production rake assets:precompile"
end

cap deploy


2

Ho riscontrato questo messaggio di errore oggi e volevo pubblicare la risoluzione nel mio caso specifico. Si scopre che il mio problema era che uno dei miei file css mancava di una parentesi graffa di chiusura e questo stava causando la compilazione del file. Potrebbe essere più difficile notarlo se si dispone di un processo automatizzato che imposta tutto (incluso il precompilamento delle risorse) per l'ambiente di produzione.


1

Dopo tutto il resto fallito ...

La mia soluzione è stata quella di cambiare il file di layout da

= stylesheet_link_tag "reset-min", 'application'

per

= stylesheet_link_tag 'application'

E ha funzionato! (È possibile inserire il file di ripristino all'interno del manifest.)


1

Solo un altro modo per risolvere questo problema su Heroku: assicurati che il tuo Rakefile sia impegnato e spinto.


0

Sul server heroku (filesystem di sola lettura), Se vuoi compilare in runtime i CSS (non è raccomandato ma puoi farlo), assicurati di aver fatto le impostazioni come sotto -

# inside config/application.rb
config.assets.enabled = true
config.assets.prefix = Rails.root.join('tmp/assets').to_s

# If you are using sass then keep gem outside of asset group
 gem 'sass-rails',   '3.1.4'

# inside config/environments/production.rb
config.assets.compile = true

0

se ritieni di aver seguito tutto bene ma che sei ancora sfortunato, assicurati di eseguire / capistrano run touch tmp / restart.txt o equivalente alla fine. Ero nella lista sfortunata ma ora :)


0

Probabilmente hai un syntax error nel CSS che stai usando.

Esegui questo comando

$ bundle exec rake assets:precompile RAILS_ENV=development --trace

Darà l'eccezione, risolto questo e il gioco è fatto.

Grazie

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.