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
Chris Muench
quelle
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.

Chris Muench
quelle
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

richardsun
quelle
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 \;
Don Law
quelle
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'
user673207
quelle
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.

Haris Krajina
quelle
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
Darchitect
quelle
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)
Mathetänzerin
quelle
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

fünfundsechzig
quelle
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.

Schnappschuss
quelle
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.)

Victor Pudeyev
quelle
1

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

Phillbaker
quelle
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
Sandip Ransing
quelle
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 :)

Muntasim
quelle
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

Shoaib Malik
quelle