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.