2014-02-23 11 views
12

Ich aktualisiere eine Anwendung, um die Asset-Pipeline zu verwenden.Rails - application.css Asset im Produktionsmodus nicht gefunden

Ich habe die CSS-Assets Kompilieren in eine Anwendung CSS-Datei bekommen, aber sie wurde nicht gefunden zu werden, wenn ich die Anwendung im Produktionsmodus mit

RAILS_ENV=production bundle exec rails s 

und ich besuchen jede Seite, die ich die richtige Ausgabe von der Get laufen Datenbank aber kein Styling und das Protokoll zeigt:

ActionController::RoutingError (No route matches [GET] 
"/assets/default.scss-1a27c...f07c.css"): 

Auch wenn diese Datei in der Öffentlichkeit existiert/assets

$ ls public/assets/def* 
public/assets/default.scss-1a27c...f07c.css  public/assets/default.scss.css 
public/assets/default.scss-1a27c...f07c.css.gz public/assets/default.scss.css.gz 

Was muss ich ändern, damit der Server die Asset-Datei findet?

Das gleiche passiert für meine anderen .css-Dateien. Sie werden mit Fingerabdrücken in öffentliche/Assets kompiliert, aber dann nicht gefunden.

Seite Quelle zeigt:

<link href="/assets/default.scss-1a27c...f07c.css" 
media="screen" rel="stylesheet" type="text/css" /> 

Die Schienen (haml) Quelle ist = stylesheet_link_tag 'default.scss.css'

public.assets curently enthält die folgenden Dateien.

$ ls public/assets/def* 
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css 
public/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css.gz 
public/assets/default.scss.css 
public/assets/default.scss.css.gz 

application.rb hat

$ cat config/application.rb 
require File.expand_path('../boot', __FILE__) 

# Pick the frameworks you want: 
require "active_record/railtie" 
require "action_controller/railtie" 
require "action_mailer/railtie" 
require "active_resource/railtie" 
require "sprockets/railtie" 
# require "rails/test_unit/railtie" 

if defined?(Bundler) 
    # 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) 
end 

module Linker 
    class Application < Rails::Application 
    config.encoding = "utf-8" 
    config.filter_parameters += [:password] 
    config.assets.enabled = true 
    config.assets.initialize_on_precompile = false # For Heroku 
    config.assets.version = '1.0' 
    end 
end 

config/environments/production hat:

$ cat config/environments/production.rb 
Linker::Application.configure do 
    config.consider_all_requests_local  = false 
    config.action_controller.perform_caching = true 
    config.assets.precompile += ['default.scss.css','main.css', 'jquery-ui-1.8.22.custom.css'] 
    config.serve_static_assets = false 
    config.assets.compress = true 
    config.assets.compile = false 
    config.assets.digest = true 
    config.log_level = :debug 
    config.i18n.fallbacks = true 
    config.active_support.deprecation = :notify 
end 

Dies scheint für alle Vermögenswerte der Fall zu sein, z.B.

Started GET "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 
ActionController::RoutingError (No route matches [GET] "/assets/default.scss-1a27c22229b7b522066181f27af4f07c.css"): 
Started GET "/assets/main-6864687b4114a1c316e444bd90f233ff.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 
ActionController::RoutingError (No route matches [GET] "/assets/main-6864687b4114a1c316e444bd90f233ff.css"): 
Started GET "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 
ActionController::RoutingError (No route matches [GET] "/assets/jquery-ui-1.8.22.custom-24319b4b1218846a3fe22a0479ae98b4.css"): 
Started GET "/assets/application-fc1d492d730f2a45581a40eac4607db8.js" for 127.0.0.1 at 2014-02-23 10:24:47 -0500 
ActionController::RoutingError (No route matches [GET] "/assets/application-fc1d492d730f2a45581a40eac4607db8.js"): 
Started GET "/images/link.ico" for 127.0.0.1 at 2014-02-23 10:24:48 -0500 
ActionController::RoutingError (No route matches [GET] "/images/link.ico"): 
+1

Hast du 'Rake Assets: Precompile' – emaillenin

+0

Ja, ich habe' $ RAILS_ENV = Produktionsbündel Exec Rake Vermögenswerte: Precompile' und neu gestartet mein Server –

+1

können Sie Ihre application.rb und production.rb Dateien kopieren? – arieljuod

Antwort

22

Rails standardmäßig dient nicht Vermögen public. Ihre production.rb:

config.serve_static_assets = false 

ändern, dass auf true und du bist gut zu gehen. (Hinweis: Sie möchten nicht, dass das in der Produktion true ist, denken Sie daran, es vor der Bereitstellung zu ändern!)

Siehe Configuring Rails Applications für Details.

+0

Warum sollte es in der Produktion falsch sein? Ich benutze rails_12factor und heroku. Danke für die weitere Erklärung! –

+1

@LeoBrown Rails geht davon aus, dass in der Produktion ein Webserver (Apache, nginx) vor Rails oder sogar ein CDN speziell für statische Assets ausgeführt wird. Alle diese können statische Ressourcen viel schneller als Rails bereitstellen. – awendt

+3

Für Rails 5: setze 'config.public_file_server.enabled' auf' true' in 'config/environments/production.rb'. – vmarquet

3

Wenn Sie rake assets:precompile tun, gehen Ihre Assets in das öffentliche Verzeichnis. Sehen Sie, wenn Sie diese Dateien in public/assets/

finden Sie etwas sehen sollte:

I, [2014-02-23T20:06:21.853314 #26915] INFO -- : Writing app_root/public/assets/application-ecd8636fc80ea2b712039c4abc365da9.css 
+1

wenn Sie haben Vorkompilieren, in welches Verzeichnis schreibt er? – emaillenin

+0

+1 Danke, es scheint an die Öffentlichkeit zu schreiben/Vermögenswerte zumindest das ist, wo die Finger gedruckten Dateien sind. –

+1

entspricht der neu geschriebene Dateiname und der angeforderte Dateiname? – emaillenin

9

In Rails 4 können Sie erhalten sie in der Produktion zeigen (lokal ausgeführt wird), durch eine Umgebungsvariable übergeben:

RAILS_SERVE_STATIC_FILES=true rails server -e production

Dies sollte so lange arbeiten, wie Sie diese Zeile haben in /config/environments/production.rb:

config.serve_static_files = ENV ['RAILS_SERVE_STATIC_FILES']. Vorhanden?

5

Die Rails 5-Lösung ähnelt der von Jules Copeland oben angegebenen Rails 4 solution.

In Ihrem vorab generierte config/environments/production.rb Datei, sollte es einen Eintrag, die etwa wie folgt aussieht:

:

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

ich eine anständige Erklärung für diese Einstellung in der Configuring Rails Applications guide bei http://guides.rubyonrails.org gefunden config.public_file_server.enabled konfiguriert Rails so, dass statische Dateien aus dem öffentlichen Verzeichnis bereitgestellt werden. Diese Option ist standardmäßig auf "true" gesetzt, aber in der Produktionsumgebung " " ist sie auf "false" gesetzt, da die zum Ausführen der Anwendung verwendete Software (z. B. NGINX oder Apache) stattdessen statische Dateien bereitstellen sollte. Wenn Sie Ihre App im Produktionsmodus mit WEBrick ausführen oder testen (es wird nicht empfohlen, WEBrick in production zu verwenden), setzen Sie die Option auf true. Andernfalls können Sie nicht Seitencache verwenden und nach Dateien suchen, die im öffentlichen Verzeichnis vorhanden sind.

Fazit: In der Produktion beginnt Ihren Schienen-Server mit wird Rails alle Dateien im öffentlichen/assets Verzeichnis zu dienen erlaubt nur als Web-Server würde. Denken Sie daran, Rails ist ein App-Server und wird dies nicht so effizient wie ein Webserver (z. B. NGINX, Apache, etc.) tun. Für reale Anwendungen sollten Sie einen dedizierten Webserver vor Rails haben, der statische Ressourcen selbst bereitstellt und Rails nur für dynamische Inhalte bei Bedarf stört. Weitere Informationen finden Sie unter this article von Justin Weiss zu den Unterschieden zwischen Webservern und Anwendungsservern.

Verwandte Themen