Nenhuma rota corresponde a [GET] / ativos

143

Eu tenho um aplicativo Rails que estou tentando testar no ambiente de produção. Fiz a execução RAILS_ENV=production rake assets:precompileque gerou todos os meus ativos em / public / assets. O problema é que, quando inicio meu aplicativo, RAILS_ENV=production rails s thinrecebo:

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

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

Alguma idéia de por que estou recebendo isso RoutingError?

Kyle Decot
fonte

Respostas:

230

No modo de produção, o Rails não será responsável por fornecer ativos estáticos. Portanto, você está recebendo esse erro. O Thin também não serve, pois é apenas um invólucro em torno do Rails.

Isso é controlado por esta configuração config/environments/production.rbno seu aplicativo:

config.serve_static_files = false

Ou no Rails 5:

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

Ou definido ENV['RAILS_SERVE_STATIC_FILES']como verdadeiro.

Você pode definir isso trueou usar um servidor real como o Apache ou o Nginx, que atenderá aos ativos estáticos. Eu suspeito que Pow também pode fazê-lo.


Se você estiver no Heroku, eles recomendam o uso da rails_12factorgema que habilita essa configuração por padrão. Coloque a gema em um productiongrupo na sua Gemfile, assim:

group :production do
  gem 'rails_12factor'
end
Ryan Bigg
fonte
5
Alguém sabe se isso é uma solução para o referido problema ao implantar no heroku?
precisa
Resposta clara, muito obrigado. Cheguei a esta página enquanto testava o ambiente de produção usando thinem minha máquina de desenvolvimento. Eu estava compilando os ativos, mas application.cssestava vazio e o log do servidor deu erro no OP.
Veritas1
2
No Rails 4 será config.serve_static_files. config.serve_static_assetsfoi descontinuado e será removido no Rails 5.
sampi 16/05
Ao implantar em uma distribuição RHEL, não toquei na configuração do ambiente padrão, apenas adicionei a gema rails_12factor no Rails v4.2.4, agora está tudo bem. Muito obrigado
Onur Kucukkece
1
@Onur: Isso significa que seu aplicativo Rails estará atendendo os ativos, em vez de seu servidor da web. Eu não recomendo esta configuração porque ela pode tornar seu servidor Rails mais lento.
quer
12

Além do que Ryan disse acima, o guia de 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 ativos estáticos, pois eles são muito mais otimizados para esta tarefa do que o vira-lata / fino / unicórnio.

bratsche
fonte
7

Acabei de resolver o mesmo problema. No meu caso, a resposta de Ryan não foi útil. Bratsche apontou para os Guias do Rails, infelizmente isso também não funcionou para mim. No entanto, o recurso foi útil. Então peguei a configuração do Nginx e adicionei a diretiva raiz , 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 é isso.

valk
fonte
3

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

remover público / ativos

Recursos 1.rake: derrube RAILS_ENV = produção

compilação de ativos

Recursos 2.rake: pré-compilar RAILS_ENV = produção

3. reinicie o servidor, por exemplo (nginx)

Albert.Qing
fonte
@ SteveO7, obviamente, os trilhos usam ativos pipleline no modo dev por padrão.
precisa saber é o seguinte
2

O Rails 4.2 adicionou / alterou esta linha nos arquivos config / environment / 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 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
Martin Sommer
fonte
Obrigado, esta é a opção mais simples. A configuração geralmente depende do ambiente do servidor e torná-lo configurável com uma variável env é bom.
akostadinov
2

No trilhos 5, a config.serve_static_filesopção mudou, então agora você precisa ter

config.public_file_server.enabled = true

servir ativos localmente.

Obromios
fonte
2

tente o código abaixo:

config / environment / production.rb

config.assets.compile = true

então execute o comando:

RAILS_ENV=production rake assets:precompile

empurre todos os arquivos de compilação e arquivo de manifesto para o servidor.

puneet18
fonte
1

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

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

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

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.

Feuda
fonte
1

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 o spring serverprocesso e seu PID e depois matá-lo via:

kill <spring-server-PID>
ToTenMilan
fonte