2013-07-28 8 views
40

Meine App funktioniert in der Entwicklungsumgebung einwandfrei. In der Produktion (rails server -e production) kann der Browser zugreifen nicht die CSS und JS-Dateien und auf der Konsole gibt es Meldungen wie:Rails-App, die keine Assets in der Produktionsumgebung bereitstellt

I, [2013-07-27T21:00:59.105459 #11449] INFO -- : Started GET "/javascripts/application.js" for 99.102.22.124 at 2013-07-27 21:00:59 +0000 
F, [2013-07-27T21:00:59.108302 #11449] FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/javascripts/application.js"): 

den Kopfabschnitt von HTML-Quellcode, wenn in der Produktionsumgebung:

<head> 
    <title>a Social Server</title> 
    <link data-turbolinks-track="true" href="/stylesheets/application.css" media="all" rel="stylesheet"> 
    <link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet"> 
    <script data-turbolinks-track="true" src="/javascripts/application.js"></script> 
    <meta content="authenticity_token" name="csrf-param"> 
<meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token"> 
</head> 

In Entwicklung env auf der anderen Seite der Kopfabschnitt wie folgt aussieht:

<head> 
    <title>a Social Server</title> 
    <link data-turbolinks-track="true" href="/assets/application.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/twitter-bootstrap-static/bootstrap.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/twitter-bootstrap-static/fontawesome.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/bootstrap_and_overrides.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/instagram.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/socialserver.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.core.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.theme.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.accordion.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.menu.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.autocomplete.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.button.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.datepicker.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.resizable.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.dialog.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.progressbar.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.selectable.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.slider.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.spinner.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.tabs.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.tooltip.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.base.css?body=1" media="all" rel="stylesheet"> 
<link data-turbolinks-track="true" href="/assets/jquery.ui.all.css?body=1" media="all" rel="stylesheet"> 
    <link href="//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css" rel="stylesheet"> 
    <script data-turbolinks-track="true" src="/assets/jquery.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery_ujs.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-transition.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-alert.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-modal.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-dropdown.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-scrollspy.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-tab.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-tooltip.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-popover.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-button.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-collapse.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-carousel.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-typeahead.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap/bootstrap-affix.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/twitter/bootstrap.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/turbolinks.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/bootstrap.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.core.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.widget.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.accordion.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.position.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.menu.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.autocomplete.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.button.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.datepicker.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.mouse.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.draggable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.resizable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.dialog.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.droppable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-blind.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-bounce.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-clip.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-drop.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-explode.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-fade.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-fold.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-highlight.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-pulsate.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-scale.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-shake.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-slide.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.effect-transfer.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.progressbar.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.selectable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.slider.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.sortable.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.spinner.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.tabs.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.tooltip.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/jquery.ui.all.js?body=1"></script> 
<script data-turbolinks-track="true" src="/assets/application.js?body=1"></script> 
    <meta content="authenticity_token" name="csrf-param"> 
<meta content="jYM4IAXTXAuKWeD4FEVrXgXRNFeB6EazU68ZBQfRqNY=" name="csrf-token"> 
</head> 

die App keine Datenbank verwenden, so habe ich deaktiviert Active. Snippets der Konfigurationsdateien:

application.rb

require File.expand_path('../boot', __FILE__) 
#require 'rails/all' 
require "action_controller/railtie" 
require "action_mailer/railtie" 
require "rails/test_unit/railtie" 
require "sprockets/railtie" 
Bundler.require(:default, Rails.env) 
module Socialserver 
    class Application < Rails::Application 
    end 
end 

production.rb

Socialserver::Application.configure do 
    config.cache_classes = true 
    config.eager_load = true 
    config.consider_all_requests_local  = false 
    config.action_controller.perform_caching = true 
    config.serve_static_assets = false 
    config.assets.js_compressor = :uglifier 
    config.assets.compile = false 
    config.assets.digest = true 
    config.assets.version = '1.0' 
    config.log_level = :info 
    config.i18n.fallbacks = true 
    config.active_support.deprecation = :notify 
    config.log_formatter = ::Logger::Formatter.new 
    config.assets.paths << Rails.root.join('app', 'assets', 'fonts') 
    config.assets.precompile += %w(.svg .eot .woff .ttf) 
end 

development.rb:

Socialserver::Application.configure do 
    config.cache_classes = false 
    config.eager_load = false 
    config.consider_all_requests_local  = true 
    config.action_controller.perform_caching = false 
    config.action_mailer.raise_delivery_errors = false 
    config.active_support.deprecation = :log 
    config.assets.debug = true 
end 

Gemfile:

source 'https://rubygems.org' 
gem 'rails', '4.0.0' 
gem 'sass-rails', '~> 4.0.0' 
gem 'uglifier', '>= 1.3.0' 
gem 'coffee-rails', '~> 4.0.0' 
gem 'jquery-rails' 
gem 'jquery-ui-rails' 
gem 'turbolinks' 
gem 'jbuilder', '~> 1.2' 
group :doc do 
    gem 'sdoc', require: false 
end 
group :twitter do 
    gem 'twitter', '4.8.1' 
end 
group :instagram do 
    gem 'instagram', '0.10.0' 
end 
group :tumblr do 
    gem 'tumblr_client' 
end 
gem 'twitter-bootstrap-rails' 
gem 'therubyracer' #needed for runtime js on amazon ec2. 

Ich entschuldige mich für das Posten so viele Informationen. Ich dachte, die Information könnte relevant sein.

p.s. Ich habe nur halb gebackenes Wissen über Schienen, also ertragen Sie mit mir. Dank ~

+0

Ich habe ein ähnliches Problem in einem Projekt, das ich auf Rails 4 aktualisiert habe. Keine der Lösungen hier gelöst. Die Bilder und Javascripts werden gut serviert, aber nicht das CSS. Die CSS-Dateien werden kompiliert, in öffentlichen/Assets angezeigt und in der Manifestdatei angezeigt, aber der Produktionsserver gibt mir immer noch diesen Fehler für CSS-Dateien. Wenn jemand irgendwelche Ideen hat, würde ich mich freuen, sie zu kennen. –

Antwort

6

In production.rb die Einstellung ändern:

Schienen 3.x

config.serve_static_assets = true 

Schienen 4.x

config.serve_static_files = true 
+0

Versuchte es, hat nicht funktioniert. – septerr

+0

Ich denke, es ist Schienen-3 spezifisch. –

66

Wenn Ihre Produktionsumgebung zu testen vor Ort, müssen Sie Kompilieren Sie die Assets lokal. Führen Sie einfach den folgenden Befehl ein:

RAILS_ENV=production bundle exec rake assets:precompile 

Es alle Vermögenswerte unter public/assets generieren.

Als Nächstes müssen Sie Rails mitteilen, dass es die Assets selbst bedienen soll. Server-Software (z. B. Nginx oder Apache) tun es für Sie in Umgebungen wie Heroku, aber lokal sollten Sie es Rails tun lassen. Ändern Sie dies in Ihrem production.rb:

config.serve_static_assets = true 

Aber stellen Sie sicher, dass Sie es zurück zu false, bevor Sie Ihren Code zur Produktion drängen!

+0

Ich versuche, diese App selbst auf einer ec2-Maschine bereitzustellen. Auf der ec2 habe ich Rubin, Schienen und dann ein "Rails Server -e Produktion" installiert. Also schätze ich einfach dem Rails-Server-Befehl zu sagen, dass die env-Produktion nicht dazu führt, dass sie die Assets kompiliert? Übrigens, wenn ich config.assets.compile = true in production.rb setze, funktionieren die Dinge wieder. Was ist der beste Weg, um eine App selbst zu implementieren? Wenn ich ein Einhorn anstelle von Webrick benutze, wird das einen Unterschied machen? – septerr

+1

Telling Rails, dass die Umgebung produziert wird, kompiliert die Assets tatsächlich nicht. Sie müssen sie lokal vorkompilieren. Vielleicht möchten Sie einen Blick auf diesen Artikel werfen, der zeigt, wie Sie mithilfe des Gems Asset_Sync Ihre Assets nach S3 und Cloudfront verschieben können: http://blog.firmhouse.com/complete-guide-to-serving-your-rails-assets -over-s3-with-asset_sync – jibai31

+0

Wenn 'Server sotware (z. B. Nginx oder Apache) es für mich tun. In meinem Verständnis bedeutet das, dass es auf der Serverseite auf 'TRUE' gesetzt ist (' config.serve_static_assets = true'), aber warum sollte ich es auf 'FALSE' zurückstellen, bevor ich es auf den Server schiebe? –

36

Das klingt nach der problem I was having.

fand ich ein blog, dass dies ein Fehler in der Rails 4.0.0 Asset-Pipeline schon sagt, und wird auf unerklärliche Weise gemildert, indem ...

config.assets.compile = true 

...in config/environments/production.rb

Abgesehen von irgendwie in tatsächlich arbeitet, um die Asset-Pipeline zu treten, wird sich diese Einstellung auf Live-Zusammenstellung von Vermögenswerten. Das ist in der Regel eine schlechte Sache für die Leistung in der Produktion, aber wenn Sie noch manuell precompile Vermögenswerte, wenn Sie bereitstellen, mit

rake assets:precompile 

... die Live-Compilation passieren sollte nie (weil die erforderlichen Vermögenswerte wurden bereits vorkompilierte) .

Ich hoffe, das hilft :)

+1

Das hat bei mir funktioniert. Ich verwende Rails 4.1 – EastsideDeveloper

+1

Funktioniert auch für 4.2. Das hat mir wahrscheinlich ein paar Stunden Schmerzen erspart - Danke! –

+1

arbeitete für mich mit Schienen 4.1.5 –

0

Die folgenden Befehl funktioniert für mich vor Ort.

rails server -e production 

habe ich den gleichen Fehler "Action :: RoutingError (keine Route treffer [GET] "/assets/application.css" Schienen s" "beim Laufen". Selbst nachdem ich die Quelle vorkompilierte, ändern Config precompile wahr. Es konnte immer noch nicht richtig geladen.

Die Option „-e Produktion“ made diese RoutingError verschwinden.

+2

Nur als Referenz für zukünftige Antworten (da dies einer Ihrer ersten scheint), ist es in der Regel wert zu erklären, was Sie tun und warum. –

2

ich denke, 4.x auf Schienen Sie Assets bis zur Produktion oder verwenden config.assets.compile vorkompilieren müssen auch beide bei Bedarf

Die d Das Standardverhalten von Rails für die Produktionsumgebung lautet "Kein Fallback auf die Asset-Pipeline, wenn ein vorkompiliertes Asset nicht erkannt wird." Also nicht. Gebrauch Compi nicht

config.assets.compile = false 

Wenn Sie diese Option verwenden, müssen Sie nicht verwenden:

config.serve_static_files = true 

Denn wenn der Vermögenswert nicht vorkompilierte wurde, wird Rails vor Anforderung dienen kompilieren.

Wenn Sie jedoch die Ressourcen vor der Produktion vorkompilieren, brauchen Sie config.assets.compile = true nicht, aber Sie benötigen config.serve_static_files = true für Rails-Anforderungen, wenn Sie nicht über http_server verfügen, um die vorkompilierten Assets zu verarbeiten.

Die Einstellung config.serve_static_assets ist veraltet.

DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role (it merely enables serving everything in the `public` folder and is unrelated to the asset pipeline). The `serve_static_assets` alias will be removed in Rails 5.0. Please migrate your configuration files accordingly. 

Ich hoffe, diese Antwort helfen Ihnen (Leser) zu verstehen, was wirklich

3

prüfen für eine Datei wie dies geschieht:

es
public/assets/.sprockets-manifest-3f7771d777ceb581d754e4fad88aa69c.json 

Wenn Sie drängen vorkompilierte Vermögenswerte zu einem Produktionsserver ist eine Chance, dass Sie verhindern, dass versteckte "dot" -Dateien gepusht werden und diese essentielle Datei wird nicht in Produktion gehen.

In meiner Umgebung muss ich Assets in einer Integrationsumgebung vorkompilieren und diese in die Produktion verschieben, sodass die Assets auf dem Produktionsrechner nicht kompiliert werden müssen. Ich blockierte fälschlicherweise alle versteckten Dateien, die auf die Produktionsmaschine verschoben wurden.

Um zu sehen, ob diese Antwort für Sie funktioniert, überprüfen Sie Ihre generierte HTML-Quelle in einem Browser vom Produktionsserver, um festzustellen, ob der Anlagenpfad generiert wurde.Wenn Sie Ihr Skript-Tag wie folgt sehen:

<script data-turbolinks-track="true" src="/javascripts/application.js"></script> 

Überprüfen Sie das Src-Attribut. Es sollte mit /assets/javascript beginnen. In diesem Fall beginnt es mit /javascript, was darauf hinweist, dass Rails keines der Assets für vorkompiliert hält.

Ich korrigierte dies, indem ich meine Push-to-Produktion (derzeit rsync) aktualisiert, so dass ich die Datei .sprockets-manifest* nach der Vorkompilierung auf meinem Integrationsserver pushen.

Auch ich benutze Standalone Passenger als meine Integration Test-Server, anstatt Webrick, da es eine realistischere Bereitstellung von statischen Dateien behandelt.

10

Wie bereits erwähnt, ist config.serve_static_assets veraltet und ersetzt durch config.serve_static_files. Wenn man config/environments/production.rb für sucht Rails-4.2 so findet man folgende:

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

Die Implikation ist, dass Einstellung und das Exportieren (in BASH) die Umgebungsvariable export RAILS_SERVE_STATIC_FILES="to any value whatsoever" in einer Sitzung vor rails s -e production ausgeführt wird das gewünschte Ergebnis, wenn es lokal zu testen und vermeiden auch, sich daran zu erinnern, production.rb zu rekodieren, bevor Sie zum Produktionshost pushen.

+3

Es gibt einen Punkt, an dem Knappheit zum Fetisch wird. –

Verwandte Themen