No hay coincidencias de ruta [GET] / activos

143

Tengo una aplicación Rails que estoy intentando probar en el entorno de producción. Ejecuté lo RAILS_ENV=production rake assets:precompileque generó todos mis activos en / public / assets. El problema es que cuando inicio mi aplicación con RAILS_ENV=production rails s thin:

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

Este archivo existe sin embargo en /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

¿Alguna idea de por qué estoy recibiendo esto RoutingError?

Kyle Decot
fuente

Respuestas:

230

En modo de producción, Rails no será responsable de servir activos estáticos. Por lo tanto, está recibiendo este error. Thin tampoco lo hará, ya que es solo una envoltura alrededor de Rails.

Esto está controlado por esta configuración config/environments/production.rben su aplicación:

config.serve_static_files = false

O en Rails 5:

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

O establecido ENV['RAILS_SERVE_STATIC_FILES']en verdadero.

Puede configurarlo trueo usar un servidor real como Apache o Nginx que servirá los activos estáticos. Sospecho que Pow también puede hacerlo.


Si estás en Heroku, recomiendan el uso de la rails_12factorgema que habilita esta configuración de forma predeterminada. Coloca la gema en un productiongrupo en tu Gemfile, así:

group :production do
  gem 'rails_12factor'
end
Ryan Bigg
fuente
55
¿Alguien sabe si esta es una solución al problema mencionado cuando se implementa en heroku?
Kyle Clegg
Respuesta clara, muchas gracias. Llegué a esta página cuando estaba probando el entorno de producción usando thinmi máquina de desarrollo. Estaba compilando los activos pero application.cssestaba vacío y el registro del servidor dio un error del OP.
veritas1
2
En Rails 4 lo será config.serve_static_files. config.serve_static_assetsestá en desuso y se eliminará en Rails 5.
muestra
Implementando en una distribución RHEL, no he tocado la configuración de entorno predeterminada, simplemente agregué la gema rails_12factor en Rails v4.2.4, ahora todo está bien. Muchas gracias
Onur Kucukkece
1
@Onur: Esto significa que su aplicación Rails servirá los activos, en lugar de su servidor web. No recomiendo esta configuración porque puede hacer que su servidor Rails sea más lento.
Ryan Bigg
12

Además de lo que Ryan dijo anteriormente, la guía de canalización de activos de Rails describe cómo configurar Apache o nginx para servir los activos estáticos para usted.

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

Realmente debería configurar nginx o Apache para servir activos estáticos, ya que están mucho mejor optimizados para esta tarea que mestizo / delgado / unicornio.

Bratsche
fuente
7

Acabo de resolver el mismo problema. En mi caso, la respuesta de Ryan no fue útil. Bratsche señaló las Guías de Rails, desafortunadamente esto tampoco funcionó para mí. Sin embargo, el recurso fue útil. Entonces tomé la configuración de Nginx desde allí y agregué la directiva raíz , apuntando al directorio público. Sin esto no 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 nginx, y eso es todo.

valk
fuente
3

De hecho, no necesitaba modificar ninguna configuración predeterminada. Simplemente vuelve a compilar el archivo de activos .

eliminar público / bienes

1.rake activos: clobber RAILS_ENV = producción

compilación de activos

2.rake activos: precompilar RAILS_ENV = producción

3. reinicie el servidor, por ejemplo (nginx)

Albert.Qing
fuente
@ SteveO7, obviamente, los rieles usan activos pipleline en modo dev por defecto.
Albert.Qing
2

Rails 4.2 ha agregado / cambiado esta línea en sus archivos config / entornos / staging.rb y production.rb:

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

Si RAILS_SERVE_STATIC_FILES no está configurado y usted es un activo de servicio de su servidor Rails (como con Unicorn), entonces el valor predeterminado será "falso" y se producirá el RoutingError.

Esta es una solución fácil:

config.serve_static_files = true
Martin Sommer
fuente
Gracias, esta es la opción más simple. La configuración generalmente depende del entorno del servidor y es agradable hacerlo configurable con una variable env.
akostadinov
2

En los rieles 5, la config.serve_static_filesopción ha cambiado, por lo que ahora debe tener

config.public_file_server.enabled = true

para servir activos localmente.

Obromios
fuente
2

intente debajo del código:

config / ambientes / production.rb

config.assets.compile = true

luego ejecute el comando:

RAILS_ENV=production rake assets:precompile

luego empuje todos los archivos de compilación y el archivo de manifiesto al servidor.

puneet18
fuente
1

Uso mina + puma + nginx para implementar mi aplicación Rails 5, obtuve

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

verifique config / entornos / 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 ya maneja esto , configúrelo correctamente

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

Las cosas funcionarán bien.

Feuda
fuente
1

Si alguien llega aquí con el mismo error en el entorno de prueba que yo, esto es lo que me ayudó:

rails assets:clobber assets:precompile RAILS_ENV=test

luego:

ps axu | grep your-username

para encontrar el spring serverproceso y su PID y luego matarlo a través de:

kill <spring-server-PID>
ToTenMilan
fuente