Rails 3.1.0 ActionView :: Template :: Error (application.css ist nicht vorkompiliert)


281

Ich habe eine einfache Rails-App mit einem einfachen Seiten-Controller mit Indexfunktion erstellt. Wenn ich die Seite lade, erhalte ich:

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 scheint das Problem zu beheben, aber warum funktioniert es nicht einfach?
Chris Muench

10
Ich habe das gleiche Problem in der Produktion, auch nach dem Ausführen von Bundle Exec Rake Assets: Vorkompilieren
Lucas Renan

Antworten:


313

Standardmäßig geht Rails davon aus, dass Ihre Dateien in der Produktionsumgebung vorkompiliert sind. Wenn Sie die Live-Kompilierung (Kompilieren Ihrer Assets zur Laufzeit) in der Produktion verwenden möchten, müssen Sie die Datei config.assets.compile auf true setzen .

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

Mit dieser Option können Sie auf Sprockets zurückgreifen, wenn Sie vorkompilierte Assets verwenden, aber vorkompilierte Dateien fehlen.

Wenn die config.assets.compileOption auf false gesetzt ist und vorkompilierte Dateien fehlen, wird ein "AssetNoPrecompiledError" angezeigt, der den Namen der fehlenden Datei angibt.


3
Vielleicht möchten Sie versuchen, was dieser Artikel sagt: devcenter.heroku.com/articles/rails31_heroku_cedar (ich habe es noch nicht selbst versucht)
Chris Muench

7
Um es klar zu machen, befindet sich die Option config.assets.compile in config / environment / Production.rb (wenn Sie in der Produktion arbeiten). Und wenn Sie in der Lage sein möchten, Live / Lazy-Kompilierung in der Produktion durchzuführen, müssen Sie auch die Lazy-Kompilierung in application.rb aktivieren.
Avioing

34
Das Aktivieren der Laufzeitkompilierung ist aufgrund des Leistungseinbruchs nicht die Lösung. Die Lösung besteht darin, das Kernproblem zu beheben, das die Vorkompilierung von Assets verhindert.
David Tuite

5
Ich habe die Assets mit RAILS_ENV = Production Bundle Exec Rake Assets vorkompiliert: Precompile. Warum erhalte ich diesen Fehler und muss auch dieses Flag setzen?
Tony

2
@ Tony, weil Sie wahrscheinlich nach etwas anderem als der Datei application.css / js / image fragen und diese nicht registriert haben application.rb. Hinzufügen zu / bearbeiten application.rb: config.assets.precompile += %w( first.css second.js ). Jetzt werden auch diese Dateien kompiliert. require<link><script>
Fügen

202

Sie erzielen eine bessere Leistung in der Produktion, wenn Sie config.assets.compile in Production.rb auf false setzen und Ihre Assets vorkompilieren. Sie können mit dieser Rechenaufgabe vorkompilieren:

bundle exec rake assets:precompile

Wenn Sie Capistrano verwenden, enthält Version 2.8.0 ein Rezept, um dies bei der Bereitstellung zu handhaben. Weitere Informationen finden Sie im Abschnitt "In Produktion" des Asset Pipeline-Handbuchs: http://guides.rubyonrails.org/asset_pipeline.html


14
Ich kann nicht glauben, wie schwer es war, herauszufinden, wie das geht.
Derekerdmann

3
Dies scheint die deutlich bessere Option zu sein: Wenn Sie die Live-Kompilierung auf "true" setzen, wird "mehr Speicher verwendet, die Leistung ist schlechter als die Standardeinstellung und dies wird nicht empfohlen". guides.rubyonrails.org/asset_pipeline.html#live-compilation
andrew.rockwell

rake -Toder bundle exec rake -Tist dein Freund.
Ryan

2
@Underworld Bundler ist ein Tool zum Verwalten von Gem-Abhängigkeiten in einer Ruby-App und in Rails 3 integriert. Wenn Sie Bundler verwenden, wird durch Ausführen bundle exec rake ...sichergestellt, dass Sie den richtigen Rake und die zugehörigen Abhängigkeiten für Ihre App laden. Wenn Sie keinen Bundler verwenden, werden Sie einfach ausgeführt rake ....
Richardsun

3
Wenn Sie den obigen Befehl ausführen
möchten

31

OK - ich hatte das gleiche Problem. Ich wollte nicht "config.assets.compile = true" verwenden - ich musste alle meine .css-Dateien zur Liste in config / environment / Production.rb hinzufügen:

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

Dann musste ich tmp / restart.txt erstellen (und später löschen)

Ich habe konsequent den Stylesheet_link_tag-Helfer verwendet, also habe ich alle zusätzlichen CSS-Dateien gefunden, die ich hinzufügen musste mit:

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

Wenn Sie Medienabfragen und unterschiedliche CSS-Dateien für unterschiedliche Auflösungen verwenden, ist dies der beste Weg.
Fa11enAngel

1
Ich muss alle meine CSS-Dateien in das Array aufnehmen? Was ist, wenn ich 40 CSS-Dateien habe?
Yozzz

30

Eine schnelle Lösung für Capistrano-Benutzer besteht darin, diese Zeile in Capfile zu setzen

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

11

Für alle diejenigen , die dies lesen , haben aber kein Problem mit application.cssund stattdessen mit ihren benutzerdefinierten CSS - Klassen zB admin.css, base.cssusw.

Die Lösung ist wie erwähnt zu verwenden

bundle exec rake assets:precompile

Und in Stylesheets verweisen nur Verweise application.css

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

Da die Assets-Pipeline alle Ihre Stylesheets in application.css vorkompiliert. Dies geschieht auch in der Entwicklung, sodass die Verwendung anderer Referenzen bei der Verwendung der Assets-Pipeline falsch ist.


8

Ich hatte genau den gleichen Fehler in meiner Entwicklungsumgebung. Am Ende musste ich nur noch Folgendes hinzufügen, um das Problem zu beheben:

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

in meine Datei config / environment / development.rb und es wurde behoben. Meine endgültige Konfiguration in der Entwicklung in Bezug auf Assets sieht folgendermaßen aus:

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

Dies war die einzige Lösung, die für mich funktioniert hat. Vielleicht war es ein Problem mit meiner Version von Rails (3.1.3)? Wie auch immer, ich konnte feststellen, dass meine Assets erfolgreich in public / Assets vorkompiliert wurden und ihre Dateinamen dieselben SHAs hatten wie in manifest.yml. Aus irgendeinem Grund suchte Rails nicht mehr am richtigen Ort nach Assets, obwohl mein Setup zuvor immer gut funktioniert hatte. Diese Änderung hat das behoben.
Antinom

Danke für diese Lösung. Ich habe versucht, einige Dinge im Entwicklungsmodus zu testen, und war überrascht, dass dort "application.css ist nicht vorkompiliert" stand, obwohl ich bereits Assets vorkompiliert hatte und public / assets / application.css im Verzeichnis vorhanden war. Überrascht setzen sie config.assets.manifest nicht automatisch für Sie in der Entwicklung wie in der Produktion.
Tyler Rick

5

Ich hatte auch dieses Problem, bei dem der Versuch, in der Produktion ohne Vorkompilierung zu laufen, immer noch nicht vorkompilierte Fehler auslöste. Ich musste ändern, welche Zeile kommentiert wurde 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
Ich möchte nur klarstellen, ob jemand später darauf stößt. Der Code, den Sie oben ändern müssen, befindet sich inconfig/application.rb
GMA

4

Hier ist die schnelle Lösung:

Wenn Sie capistrano verwenden, fügen Sie dies zu Ihrer deploy.rb hinzu:

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

Kappe bereitstellen


2

Ich bin heute auf diese Fehlermeldung gestoßen und wollte die Lösung für meinen speziellen Fall veröffentlichen. Es stellte sich heraus, dass mein Problem darin bestand, dass einer meiner CSS-Dateien eine schließende Klammer fehlte und dies dazu führte, dass die Datei nicht kompiliert wurde. Es kann schwieriger sein, dies zu bemerken, wenn Sie über einen automatisierten Prozess verfügen, der alles (einschließlich der Vorkompilierung von Assets) für Ihre Produktionsumgebung einrichtet.


1

Immerhin ist alles andere gescheitert ...

Meine Lösung bestand darin, die Layoutdatei von zu ändern

= stylesheet_link_tag "reset-min", 'application'

zu

= stylesheet_link_tag 'application'

Und es hat funktioniert! (Sie können die Rücksetzdatei in das Manifest einfügen.)


1

Nur eine andere Möglichkeit, dies bei Heroku zu beheben: Stellen Sie sicher, dass Ihr Rakefile festgeschrieben und gepusht ist.


0

Wenn Sie auf dem Heroku-Server (schreibgeschütztes Dateisystem) eine Laufzeitkompilierung von CSS wünschen (dies wird nicht empfohlen, aber Sie können dies tun), stellen Sie sicher, dass Sie die folgenden Einstellungen vorgenommen haben:

# 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

Wenn Sie der Meinung sind, dass Sie alles gut verfolgt haben, aber dennoch Pech haben, stellen Sie sicher, dass Sie / capistrano am Ende touch tmp / restart.txt oder ein gleichwertiges Programm ausführen. Ich war aber jetzt auf der Pechliste :)


0

Sie haben wahrscheinlich eine syntax errorin der CSS, die Sie verwenden.

Führen Sie diesen Befehl aus

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

Es wird die Ausnahme geben, das behoben und Sie sind alle fertig.

Vielen Dank

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.