Ich versuche, meine App in Produktion zu bringen, und Image- und CSS-Asset-Pfade funktionieren nicht.
Folgendes mache ich gerade:
- Bildelemente befinden sich in /app/assets/images/image.jpg
- Stylesheets befinden sich in /app/assets/stylesheets/style.css
- In meinem Layout verweise ich wie folgt auf die CSS-Datei:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
- Vor dem Neustart von unicorn starte ich
RAILS_ENV=production bundle exec rake assets:precompile
und es ist erfolgreich und ich sehe die Fingerabdruckdateien impublic/assets
Verzeichnis.
Wenn ich zu meiner Website navigiere, wird der Fehler 404 nicht gefunden für angezeigt mysite.com/stylesheets/styles.css
.
Was mache ich falsch?
Update: In meinem Layout sieht es 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 generierte 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>
Anscheinend sucht Rails nicht richtig nach den kompilierten CSS-Dateien. Aber es ist sehr verwirrend, warum es für Javascripts richtig funktioniert (beachten Sie den /assets/****.js
Pfad).
ruby-on-rails
ruby
asset-pipeline
ruby-on-rails-4
emersonthis
quelle
quelle
stylesheet_link_tag
.<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
public/assets
und 2. Überprüfen Sie noch einmal, ob irgendwo eine andere Anweisung versucht, diese CSS-Datei zu laden (vermutlich fest codiert).home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }
Kann tatsächlich im Kettenrad mit ersetzt werden.home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }
. Vielleicht können Sie versuchen, ob dies hilft.Antworten:
In Schienen 4 müssen Sie die folgenden Änderungen vornehmen:
Das funktioniert bei mir. Verwenden Sie den folgenden Befehl, um Assets vorkompilieren zu können
Viel Glück!
quelle
config.serve_static_files
Alias in Apache und Nginx deaktivieren und konfigurierenassets
.Ich hatte gerade das gleiche Problem und fand diese Einstellung in config / environment / Production.rb:
Ändern in
true
es funktioniert. Standardmäßig erwartet Rails, dass Sie Ihren Front-End-Webserver so konfiguriert haben, dass Anforderungen für Dateien aus dem öffentlichen Ordner verarbeitet werden, anstatt sie an die Rails-App weiterzuleiten. Vielleicht haben Sie dies für Ihre Javascript-Dateien getan, aber nicht für Ihre CSS-Stylesheets?( Siehe Dokumentation zu Rails 5 ). Wie in den Kommentaren erwähnt, können Sie mit Rails 5 nur die
RAILS_SERVE_STATIC_FILES
Umgebungsvariable festlegen , da die Standardeinstellung istconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.quelle
config.serve_static_assets
wurde umbenannt,config.serve_static_files
um ihre Rolle zu verdeutlichen (sie ermöglicht lediglich das Bereitstellen aller Elemente impublic
Ordner und steht in keinem Zusammenhang mit der Asset-Pipeline). Derserve_static_assets
Alias wird in Rails 5.0 entfernt. Bitte migrieren Sie Ihre Konfigurationsdateien entsprechend.config.serve_static_files
in Rails 4.2 undconfig.public_file_server.enabled
in Rails 5 ist . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/…config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
sodass Sie dies für Ihre Umgebung anders einstellen können, ohne den in Ihrem SCM eingecheckten Code zu ändern.In musste
/config/environments/production.rb
ich Folgendes hinzufügen:Die .js wurde bereits vorkompiliert, aber ich habe sie trotzdem hinzugefügt. Die .css und .css.erb passieren anscheinend nicht automatisch. Das
^[^_]
schließt Partials vom Kompilieren aus - es ist ein regulärer Ausdruck.Es ist ein wenig frustrierend, dass in den Dokumenten eindeutig angegeben ist, dass die Asset-Pipeline standardmäßig aktiviert ist, aber nicht klarstellt, dass dies nur für Javascripts gilt.
quelle
Ich konnte dieses Problem lösen, indem ich Folgendes änderte:
config.assets.compile = false
toconfig.assets.compile = true
in/config/environments/production.rb
Update (24. Juni 2018) : Diese Methode erstellt eine Sicherheitslücke, wenn die von Ihnen verwendete Version von Sprockets weniger als 2.12.5, 3.7.2 oder 4.0.0.beta8 ist
quelle
Für Rails 5 sollten Sie den folgenden Konfigurationscode aktivieren:
config.public_file_server.enabled = true
Standardmäßig wird Rails 5 mit der folgenden 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.quelle
passenger_env_var RAILS_SERVE_STATIC_FILES true;
den Speicherortblock meiner App in meiner Datei nginx.conf festgelegt habe.Es gibt zwei Dinge, die Sie tun müssen, um die Vermögenswerte in der Produktion zu bedienen:
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 Bereitstellungsprogramm ausführen, z. B. capistrano. Dies ist keine gute Möglichkeit, vorkompilierte Assets an SCM zu übergeben.Sie können eine Rake-Task schreiben,
RAILS_ENV=production rake assets:precompile
die jedes Mal auf den Zielservern ausgeführt wird, 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:
2) Jetzt haben Sie die Assets auf Produktionsservern und müssen sie dem Browser zur Verfügung stellen.
Auch hier haben Sie mehrere Möglichkeiten.
Aktivieren Sie die statische Rails-Datei, die in config / environment / Production.rb bereitgestellt wird
Wenn Sie Rails zum Bereitstellen statischer Dateien verwenden, wird die Leistung Ihrer 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:
quelle
Rails 4 generiert nicht mehr die Version des Assets ohne Fingerabdruck: stylesheets / style.css wird nicht für Sie generiert.
Wenn Sie verwenden,
stylesheet_link_tag
wird der richtige Link zu Ihrem Stylesheet generiertAußerdem
styles.css
sollte inconfig.assets.precompile
welcher Liste die Dinge vorkompiliert sindquelle
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
<link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
ansehe. Aber die Javascript-Dateien sind korrekt! Ich verstehe nicht, warum die gleichen Konfigurationen für .js-Dateien funktionieren, aber nicht für .css.serve_static_files
ist veraltet und wird in Rails 5.1 entfernt. Bitte verwenden Siepublic_file_server.enabled = true
stattdessen.404
. Haben Sie das gelöst?Ändern Sie Ihre Production.rb-Dateizeile
in
und auch hinzufügen
quelle
Ich verwende Ubuntu Server 14.04 , Ruby 2.2.1 und Rails 4.2.4. Ich habe ein Bereitstellungsturorial von DigitalOcean befolgt und alles ist gut Wenn ich jedoch zum Browser gehe und die IP-Adresse meines VPS eingebe, wird meine App geladen, aber ohne Stile 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 bin zu meinem App-Pfad '/ home / deployer / apps / blog' gegangen und habe den folgenden Befehl ausgeführt:
Dann starte ich einfach den VPS neu und das wars! Für mich geht das!
Hoffe, es könnte für jemand anderen nützlich sein!
quelle
Wenn Vorkompilierung eingestellt ist, brauchen Sie NICHT
da dies dazu dient, Vermögenswerte live zu dienen.
Unser Problem war, dass wir nur eine geheime Entwicklungsschlüsselbasis eingerichtet hatten
config/secrets.yml
Benötigen Sie Eintrag für Produktionsumgebung
quelle
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
und ausführen müssenRAILS_ENV=production bundle exec rake assets:precompile
Was Sie nicht tun sollten:
Einige meiner oben genannten Kollegen haben Ihnen empfohlen, dies zu tun:
Die Rails Asset Pipeline sagt über den oben genannten Ansatz:
Was du machen solltest:
Kompilieren Sie Ihre Assets vor.
RAILS_ENV=production rake assets:precompile
Sie können das wahrscheinlich mit einer Rechenaufgabe tun.
quelle
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
quelle
Überprüfen Sie zunächst Ihre Assets. Möglicherweise liegt ein Fehler beim Vorkompilieren der Assets vor.
Führen Sie den folgenden Befehl aus, um Assets in der Produktions-ENV vorkompilieren zu können:
Wenn ein Fehler angezeigt wird, entfernen Sie diesen zuerst.
Laden Sie im Falle eines Fehlers "undefinierte Variable" diese Variablendatei, bevor Sie sie in einer anderen Datei verwenden.
Beispiel:
In der Datei application.rb wird die Reihenfolge der Vorkompilierung von Assets festgelegt
Beispiel:
quelle
Ich habe es gefunden:
Die Konfigurationsoption
config.serve_static_assets
wurde umbenanntconfig.serve_static_files
, um ihre Rolle zu verdeutlichen.in
config/environments/production.rb
:Stellen Sie also env
RAILS_SERVE_STATIC_FILES
oder using einNginx
, um statische Dateien bereitzustellen. Hinzufügenconfig.serve_static_assets = true
wird weiterhin funktionieren, aber in Zukunft entfernt.quelle
Es wird nicht empfohlen, Capistrano Assets vorkompilieren zu lassen, da dies Ewigkeiten und häufig eine Zeitüberschreitung dauern kann. Versuchen Sie, lokale Assets vorkompilieren zu lassen.
Stellen Sie zunächst in config / application.rb ein, führen Sie
config.assets.initialize_on_precompile = false
dann local ausRAILS_ENV=production bin/rake assets:precompile
und fügen Sie diese öffentlichen / Assets zu git hinzu.und config / environment / development.rb ändern Sie Ihren Asset-Pfad, um die Verwendung vorkompilierter Assets zu vermeiden:
config.assets.prefix = '/dev-assets'
Wenn Sie ein Problem mit der Datenbankverbindung haben, bedeutet dies, dass Sie einen Initialisierer haben, der die Datenbank verwendet. Eine Möglichkeit, dies zu umgehen, besteht darin, eine neue Umgebung durch Duplizieren von Production.rb als möglicherweise Production2 .rb festzulegen und in database.yml die Production2- Umgebung mit der Einstellung Development DB hinzuzufügen . dann mach
RAILS_ENV=production2 bin/rake assets:precompile
Wenn Sie immer noch Probleme mit Assets haben, z. B. ckeditor, fügen Sie die js-Datei in config / initializers / assets.rb hinzu
Rails.application.config.assets.precompile += %w( ckeditor.js )
quelle
Ich kann mich irren, aber diejenigen, die empfehlen, zu ändern
config.assets.compile = true
Der Kommentar in dieser Zeile lautet: # Nicht auf die Assets-Pipeline zurückgreifen, wenn ein vorkompiliertes Asset übersehen wird.
Dies deutet darauf hin, dass Sie das Problem nicht beheben, sondern es umgehen und die Pipeline jedes Mal ausführen, wenn Sie dies auf true setzen. Dies muss sicherlich Ihre Leistung töten und den Zweck der Pipeline zunichte machen?
Ich hatte den gleichen Fehler und er lag an der Anwendung, die in einem Unterordner ausgeführt wurde, von dem Rails nichts wusste.
Meine CSS-Datei befand sich also in home / Unterordner / 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.
quelle
Dies hat das Problem für mich in der Produktion behoben. Fügen Sie es in die Nginx-Konfiguration ein.
quelle
Sogar wir hatten das gleiche Problem, wo es
RAILS_ENV=production bundle exec rake assets:precompile
erfolgreich war, aber die Dinge funktionierten nicht wie erwartet.Wir fanden, dass Einhorn der Hauptschuldige hier war.
Wie in Ihrem Fall haben auch wir das Einhorn nach dem Kompilieren der Assets neu gestartet. Es wurde festgestellt, dass beim Neustart des Einhorns nur die Arbeitsprozesse neu gestartet werden und nicht der Masterprozess.
Dies ist der Hauptgrund, warum die richtigen Vermögenswerte nicht bedient werden.
Später, nachdem wir Assets kompiliert hatten, stoppten wir Unicorn und starteten es, damit auch der Einhorn-Master-Prozess neu gestartet wurde und die richtigen Assets bereitgestellt wurden.
Das Stoppen und Starten des Einhorns führt zu einer Ausfallzeit von etwa 10 Sekunden im Vergleich zum Neustart des Einhorns. Dies ist die Problemumgehung, die verwendet werden kann, wenn die langfristige Lösung vom Einhorn auf Puma umgestellt wird.
quelle