2011-10-19 11 views
122

Ho un'app Rails che sto provando a testare nell'ambiente di produzione. Ho eseguito RAILS_ENV=production rake assets:precompile che ha generato tutte le mie risorse in/public/assets. Il problema è che quando inizio la mia app w/RAILS_ENV=production rails s thin ottengo:Nessuna corrispondenza corrisponde a [GET]/assets

ActionController::RoutingError (No route matches [GET] "/assets/application-eff78fd67423795a7be3aa21512f0bd2.css"): 

Questo file esiste anche se a /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

Qualche idea sul motivo per cui sto ricevendo questo RoutingError?

risposta

202

In modalità produzione, Rails non sarà responsabile della fornitura di asset statici. Pertanto, stai ricevendo questo errore. Anche Thin non lo farà, visto che è solo un involucro attorno a Rails.

Questa è controllata da questa impostazione nel config/environments/production.rb nell'applicazione:

config.serve_static_files = false 

O in Rails 5:

# config/environments/production.rb 
config.public_file_server.enabled = true 

o impostare ENV['RAILS_SERVE_STATIC_FILES'] su true.

È possibile impostare su tale true o utilizzare un server reale come Apache o Nginx che servirà le risorse statiche. Sospetto che Pow possa anche farlo.


Se siete su Heroku, si consiglia l'uso del rails_12factor gemma che consente l'impostazione di default. Posizionare la gemma in un gruppo production nel vostro Gemfile, in questo modo:

group :production do 
    gem 'rails_12factor' 
end 
+5

Qualcuno sa se questa è una soluzione al problema indicato durante la distribuzione in heroku? –

+0

Risposta chiara, molte grazie. Sono arrivato a questa pagina mentre stavo testando l'ambiente di produzione usando 'thin' sulla mia macchina di sviluppo. Stavo compilando le risorse ma 'application.css' era vuoto e il log del server dava errore all'OP. – veritas1

+2

In Rails 4 sarà 'config.serve_static_files'. 'config.serve_static_assets' è deprecato e verrà rimosso in Rails 5. – sampi

12

Aggiungendo a ciò che ha detto Ryan sopra, la guida di asset gasdotto Rails descrive come configurare Apache o nginx per servire i beni statici per voi.

http://guides.rubyonrails.org/asset_pipeline.html

Si dovrebbe davvero configurazione nginx o Apache per servire beni statici, in quanto sono molto meglio ottimizzati per questo compito di bastardino/sottile/unicorno.

6

Appena risolto lo stesso problema. Nel mio caso la risposta di Ryan non è stata di aiuto. Bratsche indicò le Guide di Rails, ma sfortunatamente non funzionava anche per me. Tuttavia, la risorsa è stata utile. Così ho preso la configurazione Nginx da lì e ho aggiunto la direttiva root, che punta alla directory pubblica. Senza questo non funziona.

# serve static assets 
    location ~ ^/assets/ { 
    expires 1y; 
    root /path/to/my/cool_project/public; 
    add_header Cache-Control public; 

    add_header ETag ""; 
    break; 
    } 

Restart nginx, e il gioco è fatto.

2

Rails 4.2 ha aggiunto/cambiato questa linea nel tuo config/ambienti/staging.rb e file production.rb:

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

Se RAILS_SERVE_STATIC_FILES non è impostato, e vi sono risorse di servizio dal server Rails (come con Unicorn), quindi verrà impostato su "false" e si verificherà il RoutingError.

Si tratta di una soluzione semplice:

config.serve_static_files = true 
+0

Grazie, questo è il più semplice La configurazione di solito dipende dall'ambiente del server e renderlo configurabile con una variabile env è bello – akostadinov

2

In effetti non c'era bisogno di modificare i file di configurazione di default. È sufficiente ricompilare nuovamente il file delle risorse.

rimuovere pubblici/Attività

1.rake beni: clobber RAILS_ENV = produzione

beni compilano

2.rake beni: RAILS_ENV precompilare = produzione

3. server di riavvio, ad es. (Nginx)

+0

Questo ha funzionato per me, ma sono curioso di sapere perché? – SteveO7

+0

@ SteveO7, ovviamente, le rotaie usano le risorse pipeline in modalità dev per impostazione predefinita . –

1

In rotaie 5, l'opzione config.serve_static_files è cambiato, così ora è necessario avere

config.public_file_server.enabled = true 

per servire le attività a livello locale.

0

Io uso mina + puma + nginx di distribuire i miei Rails 5 applicazione, ho ottenuto

ActionController::RoutingError (No route matches [GET] "/assets/application-658cf2ab3ac93aa5cb41a762b52cf49d7184509c307922cd3fbb61b237a59c1a.css") 

controllo config/ambienti/production.rb

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

Nginx già gestisce questo, config è corretcly

upstream puma { 
    server unix:///home/deploy/apps/appname/shared/tmp/sockets/appname-puma.sock; 
} 

server { 
    listen 80 default_server deferred; 
    # server_name example.com; 

    root /home/deploy/apps/appname/current/public; 
    access_log /home/deploy/apps/appname/current/log/nginx.access.log; 
    error_log /home/deploy/apps/appname/current/log/nginx.error.log info; 

    location ^~ /assets/ { 
    gzip_static on; 
    expires max; 
    add_header Cache-Control public; 
    } 

    try_files $uri/index.html $uri @puma; 
    location @puma { 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    proxy_pass http://puma; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 10M; 
    keepalive_timeout 10; 
} 

le cose funzioneranno bene.

1

prova sottostante Codice:

config/ambienti/production.rb

config.assets.compile = true 

quindi eseguire il comando:

RAILS_ENV=production rake assets:precompile 

poi spingere tutti compila i file e file di manifesto per server.

0

Se qualcuno arrivare con lo stesso errore nell'ambiente di prova, come me, ecco cosa mi ha aiutato:

rails assets:clobber assets:precompile RAILS_ENV=test 

poi:

ps axu | grep your-username 

per trovare spring server processo e il suo PID poi uccidere it via:

kill <spring-server-PID> 
Problemi correlati