Nenhuma rota corresponde a / assets

Eu tenho um aplicativo Rails que estou tentando testar no ambiente de produção. Eu corri RAILS_ENV=production rake assets:precompile que gerou todos os meus ativos em / public / assets. O problema é que quando eu inicio meu aplicativo com o RAILS_ENV=production rails s thin eu fico:

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

Este arquivo existe em /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css .

Alguma RoutingError por que estou recebendo este RoutingError ?

No modo de produção, o Rails não será responsável pelo atendimento de ativos estáticos. Portanto, você está recebendo esse erro. Thin não fará isso, já que é apenas um wrapper em torno do Rails.

Isso é controlado por essa configuração em config/environments/production.rb em seu aplicativo:

 config.serve_static_files = false 

Ou no Rails 5:

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

Ou defina ENV['RAILS_SERVE_STATIC_FILES'] como true.

Você pode definir isso como true ou usar um servidor real como Apache ou Nginx, que servirá os ativos estáticos. Eu suspeito que Pow também possa fazer isso.


Se você está no Heroku, eles recomendam o uso do gem rails_12factor que ativa essa configuração por padrão. Coloque a gema em um grupo de production no seu Gemfile , assim:

 group :production do gem 'rails_12factor' end 

Somando-se ao que Ryan disse acima, o guia do pipeline de ativos do Rails descreve como configurar o Apache ou o nginx para servir os ativos estáticos para você.

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

Você realmente deve configurar o nginx ou o Apache para servir resources estáticos, já que eles são muito melhor otimizados para essa tarefa do que o mestiço / thin / unicorn.

Apenas resolvi o mesmo problema. No meu caso, a resposta de Ryan não foi útil. Bratsche apontou para os Guias de Rails, infelizmente isso não funcionou para mim também. No entanto, o recurso foi útil. Então eu peguei a configuração do Nginx e adicionei a diretiva root , apontando para o diretório público. Sem isso, não funciona.

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

Reinicie o nginx e pronto.

Na verdade, você não precisou modificar nenhuma configuração padrão. Você acabou de recompilar o arquivo de ativos novamente .

remover público / ativos

1.rake assets: clobber RAILS_ENV = produção

ativos compilar

2.rake ativos: pré-compilation RAILS_EN = produção

Servidor 3.restart, por exemplo, (nginx)

O Rails 4.2 adicionou / alterou esta linha em seus arquivos config / environments / staging.rb e production.rb:

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

Se RAILS_SERVE_STATIC_FILES não estiver definido e você for um ativo de serviço do seu servidor Rails (como no Unicorn), o padrão será “false” e o RoutingError ocorrerá.

Esta é uma solução fácil:

 config.serve_static_files = true 

No rails 5, a opção config.serve_static_files mudou, então agora você precisa ter

 config.public_file_server.enabled = true 

para servir ativos localmente.

tente abaixo do código:

config / environments / production.rb

 config.assets.compile = true 

então execute o comando:

 RAILS_ENV=production rake assets:precompile 

em seguida, empurre todos os arquivos de compilation e o arquivo de manifesto para o servidor.

Eu uso mina + puma + nginx para implantar meu aplicativo Rails 5, consegui

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

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

O NGINX já lida com isso , configura-o corretamente

 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; } 

as coisas vão funcionar bem.

Se alguém chegar aqui com o mesmo erro no ambiente de teste que eu, aqui está o que me ajudou:

 rails assets:clobber assets:precompile RAILS_ENV=test 

então:

 ps axu | grep your-username 

para encontrar spring server processo do spring server e seu PID, em seguida, mate-o através de:

 kill  
    Intereting Posts