Nessun percorso corrisponde a [GET] / risorse


143

Ho un'app Rails che sto provando a testare nell'ambiente di produzione. Ho corso RAILS_ENV=production rake assets:precompileche ha generato tutte le mie risorse in / public / assets. Il problema è che quando avvio la mia app con RAILS_ENV=production rails s thin:

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

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

Qualche idea sul perché sto ricevendo questo RoutingError?

Risposte:


230

In modalità di produzione, Rails non sarà responsabile del servizio di risorse statiche. Pertanto, ricevi questo errore. Neanche Thin lo farà, dato che è solo un involucro attorno a Rails.

Questo è controllato da questa impostazione config/environments/production.rbnella tua applicazione:

config.serve_static_files = false

O in Rails 5:

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

O impostato ENV['RAILS_SERVE_STATIC_FILES']su true.

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


Se sei su Heroku, raccomandano l'uso della rails_12factorgemma che abilita questa impostazione di default. Posiziona la gemma in un productiongruppo nel tuo Gemfile, in questo modo:

group :production do
  gem 'rails_12factor'
end

5
Qualcuno sa se questa è una soluzione al problema detto durante la distribuzione su heroku?
Kyle Clegg,

Risposta chiara, molte grazie. Sono arrivato a questa pagina mentre stavo testando l'ambiente di produzione usando thinsulla mia macchina di sviluppo. Stavo compilando le risorse ma application.cssera vuoto e il registro del server ha dato l'errore dell'OP.
veritas1

2
In Rails 4 lo sarà config.serve_static_files. config.serve_static_assetsè obsoleto e verrà rimosso in Rails 5.
sampi

Distribuendo su una distribuzione RHEL, non ho toccato la configurazione dell'ambiente predefinita, ho appena aggiunto la gemma rails_12factor in Rails v4.2.4, ora è tutto a posto. Grazie mille
Onur Kucukkece,

1
@Onur: ciò significa che l'applicazione Rails servirà le risorse, piuttosto che il tuo server web. Non consiglio affatto questa configurazione perché può rallentare il server Rails.
Ryan Bigg,

12

Aggiungendo ciò che Ryan ha detto sopra, la guida alla pipeline delle risorse di Rails descrive come configurare Apache o nginx per servire le risorse statiche per te.

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

Dovresti davvero impostare nginx o Apache per servire risorse statiche, poiché sono molto meglio ottimizzate per questa attività rispetto a ibrido / magro / unicorno.


7

Ho appena risolto lo stesso problema. Nel mio caso la risposta di Ryan non è stata utile. Bratsche indicò le Guide di Rails, sfortunatamente questo non funzionò anche per me. Tuttavia la risorsa è stata utile. Quindi ho preso la configurazione di Nginx da lì e ho aggiunto la direttiva root , indicando la 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;
   }

Riavvia nginx e basta.


3

In effetti, non è necessario modificare alcuna configurazione predefinita. Devi solo ricompilare nuovamente il file delle risorse .

rimuovere pubblico / beni

1. Asset del freno: clobber RAILS_ENV = produzione

compilazione delle risorse

2. Asset del freno: precompilare RAILS_ENV = produzione

3.restart server, ad es. (Nginx)


@ SteveO7, ovviamente, le rotaie utilizzano per impostazione predefinita la pipeline di risorse in modalità sviluppo.
Albert.Qing

2

Rails 4.2 ha aggiunto / modificato questa riga nei file config / environment / staging.rb e production.rb:

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

Se RAILS_SERVE_STATIC_FILES non è impostato e tu sei asset di servizio dal tuo server Rails (come con Unicorn), verrà impostato automaticamente su "false" e si verificherà RoutingError.

Questa è una soluzione semplice:

config.serve_static_files = true

Grazie, questa è l'opzione più semplice. La configurazione di solito dipende dall'ambiente server e renderlo configurabile con una variabile env è utile.
Akostadinov,

2

In rotaie 5, l' config.serve_static_filesopzione è cambiata, quindi ora devi avere

config.public_file_server.enabled = true

servire beni localmente.


2

prova sotto il codice:

config / ambienti / production.rb

config.assets.compile = true

quindi esegui il comando:

RAILS_ENV=production rake assets:precompile

quindi invia tutti i file di compilazione e il file manifest sul server.


1

Uso mina + puma + nginx per distribuire la mia applicazione Rails 5, ho capito

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

controlla config / environment / 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 lo gestisce già , configurandolo correttamente

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

Se qualcuno arriva qui con lo stesso errore nell'ambiente di test che faccio io, ecco cosa mi ha aiutato:

rails assets:clobber assets:precompile RAILS_ENV=test

poi:

ps axu | grep your-username

per trovare il spring serverprocesso e il suo PID, quindi ucciderlo tramite:

kill <spring-server-PID>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.