Nessuna rotta corrisponde a / asset

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 avvio la mia app w / RAILS_ENV=production rails s thin ottengo:

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

Questo file esiste comunque in /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css .

Qualche idea sul perché sto ricevendo questo RoutingError ?

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.

Questo è controllato da questa impostazione in config/environments/production.rb nella tua applicazione:

 config.serve_static_files = false 

O in Rails 5:

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

Oppure imposta ENV['RAILS_SERVE_STATIC_FILES'] su true.

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


Se sei su Heroku, ti raccomandano l’uso della gem rails_12factor che abilita questa impostazione per impostazione predefinita. Inserisci la gem in un gruppo di production nel tuo Gemfile , in questo modo:

 group :production do gem 'rails_12factor' end 

Aggiungendo a ciò che Ryan ha detto in precedenza, la guida della pipeline degli asset di Rails descrive come configurare Apache o nginx per servire le risorse statiche.

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

Dovresti davvero configurare nginx o Apache per servire le risorse statiche, poiché sono molto meglio ottimizzate per questa attività rispetto a mongrel / thin / unicorn.

Ho 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 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 il gioco è fatto.

In effetti non hai bisogno di modificare alcuna configurazione di default. Ricompilare nuovamente il file delle risorse .

rimuovere pubblico / beni

Risorse 1.rake: clobber RAILS_ENV = produzione

beni compilati

Attività 2.rake: precompilare RAILS_ENV = produzione

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

Rails 4.2 ha aggiunto / modificato questa riga nei file config / environments / 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), allora verrà impostato su “false” e si verificherà il RoutingError.

Questa è una soluzione semplice:

 config.serve_static_files = true 

In rails 5, l’opzione config.serve_static_files è cambiata, quindi ora è necessario averlo

 config.public_file_server.enabled = true 

servire le risorse localmente.

prova sotto il codice:

config / ambienti / production.rb

 config.assets.compile = true 

quindi esegui il comando:

 RAILS_ENV=production rake assets:precompile 

quindi spingere tutti i file di compilazione e manifestare il file sul server.

Io uso mina + puma + nginx per distribuire la mia applicazione Rails 5, ho ottenuto

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

controlla config / environments / 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 , lo configura 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

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

 rails assets:clobber assets:precompile RAILS_ENV=test 

poi:

 ps axu | grep your-username 

per trovare il processo del spring server e il suo PID, quindi ucciderlo tramite:

 kill