it-swarm.com.de

Schienen 4: Vermögenswerte werden in der Produktion nicht geladen

Ich versuche, meine App in Produktion zu bringen und Image- und CSS-Asset-Pfade funktionieren nicht.

Folgendes mache ich gerade:

  • Bildbestände leben in /app/assets/images/image.jpg 
  • Stylesheets leben in /app/assets/stylesheets/style.css
  • In meinem Layout verweise ich auf die CSS-Datei folgendermaßen: <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
  • Vor dem Neustart von Unicorn führe ich Rails_ENV=production bundle exec rake assets:precompile aus und es ist erfolgreich, und ich sehe die Fingerabdruckdateien im public/assets-Verzeichnis.

Wenn ich zu meiner Website browse, erhalte ich einen Fehler 404 für mysite.com/stylesheets/styles.css

Was mache ich falsch?

Update: .__ In meinem Layout sieht das so aus:

<%= stylesheet_link_tag    "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag    "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

Die generierende Quelle ist folgende:

<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>

Es sieht so aus, als würde Rails nicht nach den kompilierten CSS-Dateien suchen. Aber es ist sehr verwirrend , warum es für Javascripts korrekt funktioniert (Beachte den Pfad /assets/****.js).

107
emersonthis

In /config/environments/production.rb musste ich folgendes hinzufügen:

Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb )

Das .js wurde bereits vorkompiliert, aber ich habe es trotzdem hinzugefügt. Die .css und .css.erb werden anscheinend nicht automatisch ausgeführt. Der ^[^_] schließt Partials von der Kompilierung aus - es ist ein Regex.

Es ist ein wenig frustrierend, dass die Dokumente eindeutig angeben, dass die Asset-Pipeline IS standardmäßig aktiviert ist, jedoch nicht klarstellt, dass dies nur für Javascripts gilt.

32
emersonthis

In Rails 4 müssen Sie die folgenden Änderungen vornehmen:

config.assets.compile = true
config.assets.precompile =  ['*.js', '*.css', '*.css.erb'] 

Das funktioniert bei mir. Verwenden Sie den folgenden Befehl, um Assets vorzukompilieren

Rails_ENV=production bundle exec rake assets:precompile

Viel Glück!

100

Ich hatte gerade das gleiche Problem und fand diese Einstellung in config/umwelts/production.rb:

# Rails 4:
config.serve_static_assets = false

# Or for Rails 5:
config.public_file_server.enabled = false

Das Ändern in true hat es zum Laufen gebracht. Es scheint, dass Rails standardmäßig erwartet, dass Sie Ihren Front-End-Webserver so konfiguriert haben, dass er Anfragen nach Dateien aus dem Öffentlichen Ordner verarbeitet, anstatt sie an die Rails-App zu senden. Vielleicht haben Sie dies für Ihre Javascript-Dateien gemacht, nicht aber für Ihre CSS-Stylesheets?

( Siehe Rails 5-Dokumentation ). Wie bereits erwähnt, können Sie in Rails 5 einfach die Umgebungsvariable Rails_SERVE_STATIC_FILES setzen, da die Standardeinstellung config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present? ist.

76
davmac

Ich konnte dieses Problem lösen, indem ich änderte: config.assets.compile = false in
config.assets.compile = true in /config/environments/production.rb

Update (24. Juni 2018): Diese Methode verursacht eine Sicherheitsanfälligkeit , wenn die von Ihnen verwendete Sprocket-Version weniger als 2.12.5, 3.7.2 oder 4.0.0.beta8 ist

22
Yanofsky

Für Rails 5 sollten Sie den folgenden Konfigurationscode aktivieren:

config.public_file_server.enabled = true

Standardmäßig wird Rails 5 mit dieser Konfigurationszeile geliefert: 

config.public_file_server.enabled = ENV['Rails_SERVE_STATIC_FILES'].present?

Daher müssen Sie die Umgebungsvariable Rails_SERVE_STATIC_FILES auf true setzen. 

10
ytbryan

Es gibt zwei Dinge, die Sie ausführen müssen, um die Assets in der Produktion zu bedienen:

  1. Kompilieren Sie die Assets vor.
  2. Stellen Sie die Assets auf dem Server für den Browser bereit.

1) Um die Assets vorkompilieren zu können, haben Sie mehrere Möglichkeiten.

  • Sie können rake assets:precompile auf Ihrem lokalen Computer ausführen, ihn an die Quellcodeverwaltung (git) übergeben und dann das Implementierungsprogramm ausführen, beispielsweise capistrano. Dies ist keine gute Möglichkeit, vorkompilierte Assets an SCM zu übergeben.

  • Sie können eine Rake-Task schreiben, die Rails_ENV=production rake assets:precompile auf den Zielservern jedes Mal ausführt, wenn Sie Ihre Rails-App für die Produktion bereitstellen, bevor Sie den Server neu starten.

Der Code in einer Aufgabe für capistrano sieht folgendermaßen aus:

on roles(:app) do
  if DEPLOY_ENV == 'production'
    execute("cd #{DEPLOY_TO_DIR}/current && Rails_ENV=production rvm #{Ruby_string} do rake assets:precompile")
  end
end

2) Jetzt haben Sie die Assets auf Produktionsservern. Sie müssen sie dem Browser zur Verfügung stellen.

Wieder haben Sie mehrere Möglichkeiten.

  • Aktivieren Sie die statische Datei von Rails, die in config/umwelts/production.rb bedient wird.

    config.serve_static_assets = true # old
    
    or
    
    config.serve_static_files = true # new
    

    Durch die Verwendung von Rails zum Bereitstellen statischer Dateien wird die Leistung der Rails-App beeinträchtigt.

  • Konfigurieren Sie Nginx (oder Apache) für die Bereitstellung statischer Dateien.

    Zum Beispiel sieht mein Nginx, der für die Arbeit mit Puma konfiguriert wurde, folgendermaßen aus:

    location ~ ^/(assets|images|fonts)/(.*)$ {
        alias /var/www/foster_care/current/public/$1/$2;
        gzip on;
        expires max;
        add_header Cache-Control public;
    }
    
9

Rails 4 generiert nicht mehr die nicht mit einem Fingerabdruck versehene Version des Assets: stylesheets/style.css wird nicht für Sie generiert.

Wenn Sie stylesheet_link_tag verwenden, wird der richtige Link zu Ihrem Stylesheet generiert

Außerdem sollte styles.css in config.assets.precompile enthalten sein. Dies ist die Liste der Dinge, die vorkompiliert wurden

4

Ändern Sie Ihre Production.rb-Dateizeile

config.assets.compile = false

in 

config.assets.compile = true

und auch hinzufügen

config.assets.precompile =  ['*.js', '*.css', '*.css.erb']
3
Jassa Mahal

Ich verwende Ubuntu Server 14.04, Ruby 2.2.1 und Rails 4.2.4. Ich habe ein Deployment Turorial von DigitalOcean gefolgt und alles lief gut, aber als ich Gehen Sie zum Browser und geben Sie die IP-Adresse meines VPS ein. Meine App wird geladen, jedoch ohne Styles und Javascript.

Die App läuft mit Unicorn und Nginx. Um dieses Problem zu beheben, habe ich meinen Server über SSH mit meinem Benutzer 'deployer' eingegeben und gehe zu meinem Anwendungspfad, der '/ home/deployer/apps/blog' ist. und führen Sie den folgenden Befehl aus:

Rails_ENV=production bin/rake assets:precompile

Dann starte ich einfach die VPS neu und das ist es! __. Es funktioniert für mich!

Hoffe, es könnte für jemand anderen nützlich sein!

2
Alex Ventura

Wenn Vorkompilierung eingestellt ist, brauchen Sie NICHT

config.assets.compile = true

denn dies dient dazu, Vermögenswerte live zu dienen.

Unser Problem war, dass wir nur die Basis für die Entwicklung geheimer Schlüssel in config/secrets.yml festgelegt hatten.

development:
    secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'

Eingabe für die Produktionsumgebung erforderlich

2
xxjjnn

Was Sie nicht tun sollten:

Einige meiner Kollegen haben Sie dazu empfohlen:

config.serve_static_assets = true  ## DON”T DO THIS!! 
config.public_file_server.enabled = true ## DON”T DO THIS!!

Die Rails-Asset-Pipeline sagt über den obigen Ansatz: 

Dieser Modus belegt mehr Speicher, ist schlechter als der Standard und wird nicht empfohlen. Siehe hier: ( http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation )

Was du machen solltest:

1. Kompilieren Sie Ihre Assets vorab.

Rails_ENV=production rake assets:precompile

2. Fügen Sie diese Dateien zu git hinzu.

git add –-all

3. Übertragen Sie die Änderungen in Ihren Master-Zweig und stellen Sie sie erneut bereit.

git Push Origin master

2
BKSpurgeon

Ich habe es gefunden:

Die Konfigurationsoption config.serve_static_assets wurde umbenannt in config.serve_static_files, um seine Rolle zu klären.

im config/environments/production.rb:

# Disable serving static files from the `/public` folder by default since
# Apache or NGINX already handles this.
config.serve_static_files = ENV['Rails_SERVE_STATIC_FILES'].present?

Also setze env Rails_SERVE_STATIC_FILES oder verwenden Sie Nginx, um statische Dateien bereitzustellen. Hinzufügen config.serve_static_assets = true wird noch funktionieren, aber in Zukunft entfernt.

1
Daniel Wei

Der Standard-Matcher für das Kompilieren von Dateien umfasst application.js, application.css und alle Nicht-JS/CSS-Dateien (dies schließt automatisch alle Image-Assets ein) aus App/Assets-Ordnern, einschließlich Ihrer Gems:

Wenn Sie andere Manifestierungen oder einzelne Stylesheets und JavaScript-Dateien zum Einfügen haben, können Sie sie dem vorkompilierten Array in config/initializers/assets.rb hinzufügen:

Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js']

http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

1
FreePender

Selbst wir hatten das gleiche Problem, dass Rails_ENV=production bundle exec rake assets:precompile erfolgreich war, aber die Dinge nicht wie erwartet funktionierten.
Wir fanden heraus, dass Unicorn hier der Hauptschuldige war. 

Genau wie in Ihrem Fall haben wir Unicorn nach dem Kompilieren der Assets neu gestartet. Es wurde festgestellt, dass beim Neustart von Unicorn nur die Arbeitsprozesse neu gestartet werden und nicht der Masterprozess.
Dies ist der Hauptgrund, warum die korrekten Vermögenswerte nicht geliefert werden. 

Nach dem Kompilieren von Assets haben wir Unicorn gestoppt und neu gestartet, sodass der Unicorn-Masterprozess ebenfalls neu gestartet wird und die korrekten Assets bedient werden.
Das Stoppen und Starten von Unicorn verursacht im Vergleich zum Neustart des Unicorn etwa 10 Sekunden Ausfallzeit. Dies ist die Problemumgehung, die verwendet werden kann, wenn eine langfristige Lösung von Unicorn zu Puma führt.

0
Bhavya Keniya

es wird nicht empfohlen, Capistrano-Assets vorkompilieren zu lassen, da dies ewig dauern kann und oft eine Zeitüberschreitung auftritt. Versuchen Sie lokale Assets vorkompilieren zu lassen. 

Zuerst setzen Sie es in config/application.rb config.assets.initialize_on_precompile = false , Dann führen Sie local Rails_ENV=production bin/rake assets:precompile Aus und fügen Sie diese public/assets zu git hinzu. 

und config /virones/development.rb, ändern Sie Ihren Asset-Pfad, um die Verwendung vorkompilierter Assets zu vermeiden:

config.assets.prefix = '/dev-assets'

Wenn Sie ein Db-Verbindungsproblem haben, bedeutet dies, dass Sie über einen Initialisierer verfügen, der Db verwendet. Eine Möglichkeit besteht darin, eine neue Umgebung durch Duplizieren von production.rb als vielleicht production2 . rb festzulegen und in database.yml production2 environment mit development db-Einstellung hinzuzufügen. dann mach

Rails_ENV=production2 bin/rake assets:precompile

wenn Sie immer noch Probleme mit Assets haben, z. B. mit ckeditor, fügen Sie die js -Datei in die Datei config/initializers/assets.rb ein

Rails.application.config.assets.precompile += %w( ckeditor.js )

0
James Tan
location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;
  add_header ETag "";
}

Dies hat das Problem für mich in der Produktion behoben. Legen Sie es in die Nginx-Konfiguration.

0

Ich kann mich irren, aber diejenigen, die einen Wechsel empfehlen

config.assets.compile = true

Der Kommentar in dieser Zeile lautet: # Nicht auf die Asset-Pipeline zurückgreifen, wenn ein vorkompiliertes Asset verfehlt wird.

Dies legt nahe, dass Sie das Problem auf true setzen, indem Sie das Problem nicht lösen, sondern es umgehen und die Pipeline jedes Mal ausführen. Dies muss sicherlich Ihre Leistung töten und den Zweck der Pipeline zunichte machen?

Ich hatte den gleichen Fehler und es lag an der Anwendung, die in einem Unterordner ausgeführt wurde, von dem Rails nichts wusste.

Also meine css-Datei war in home/subfolder/app/public/.... aber Rails suchte in home/app/public/...

versuchen Sie entweder, Ihre App aus dem Unterordner zu verschieben oder Rails mitzuteilen, dass sie sich in einem Unterordner befindet.

0
Brad

Überprüfen Sie zunächst Ihre Assets. Möglicherweise ist ein Fehler beim Kompilieren der Assets aufgetreten.

Führen Sie den folgenden Befehl aus, um Assets im Produktions-ENV vorzukompilieren:

Rails_ENV=production rake assets:precompile

Wenn ein Fehler angezeigt wird, entfernen Sie diesen zuerst. 

Bei einem "undefined variable" Fehler laden Sie diese Variablendatei, bevor Sie sie in einer anderen Datei verwenden.

beispiel:

@import "variables";
@import "style";

in application.rb Dateisatzreihenfolge der Vorkompilierung von Assets

beispiel:

config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js']

config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css']
0
Chitresh goyal