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 .
Risorse 1.rake: clobber RAILS_ENV = produzione
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.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