2011-10-19 25 views
122

Tengo una aplicación de Rails que intento probar en el entorno de producción. Ejecuté RAILS_ENV=production rake assets:precompile que generó todos mis activos en/public/assets. El problema es que cuando empiezo mi aplicación w/RAILS_ENV=production rails s thin me sale:Sin coincidencias de ruta [OBTENER]/activos

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

Este archivo existe aunque a /public/assets/application-eff78fd67423795a7be3aa21512f0bd2.css.

¿Alguna idea de por qué me sale esto RoutingError?

Respuesta

202

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

Esto es controlado por esta configuración en config/environments/production.rb en su aplicación:

config.serve_static_files = false 

O en los carriles 5:

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

o conjunto ENV['RAILS_SERVE_STATIC_FILES'] true.

Puede configurar ese true o utilizar 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 gema rails_12factor que permite esta configuración por defecto. Colocar la gema en un grupo production en su Gemfile, así:

group :production do 
    gem 'rails_12factor' 
end 
+5

Alguien sabe si esta es una solución a dicho problema al implementar en heroku? –

+0

Respuesta clara, muchas gracias. Llegué a esta página cuando estaba probando el entorno de producción usando 'thin' en mi máquina de desarrollo. Estaba compilando los activos, pero 'application.css' estaba vacío y el registro del servidor dio un error del OP. – veritas1

+2

En Rails 4 será 'config.serve_static_files'. 'config.serve_static_assets' está en desuso y se eliminará en Rails 5. – sampi

12

Agregando a lo que Ryan dijo anteriormente, la guía de tubería activo rieles describe cómo configurar Apache o Nginx publique los elementos estáticos para usted.

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

Usted realmente debe nginx configuración o Apache para servir activos estáticos, ya que son mucho mejor optimizados para esta tarea que mestizo/delgada/unicornio.

6

Acabo de resolver el mismo problema. En mi caso, la respuesta de Ryan no fue útil. Bratsche señaló las Guías Rails, desafortunadamente esto no funcionó para mí también. Sin embargo, el recurso fue útil. Así que tomé la configuración de Nginx desde allí y agregué la directiva root, 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; 
    } 

Reinicia nginx, y listo.

2

Rails 4.2 ha añadido/modificado esta línea en su fichero de configuración/ambientes/staging.rb y archivos production.rb:

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

Si RAILS_SERVE_STATIC_FILES no está establecido, y que son activos del servicio desde el servidor de carriles (al igual que con Unicorn), se establecerá en "false" y se producirá RoutingError.

Esta es una solución fácil:

config.serve_static_files = true 
+0

Gracias, esto es más simple opción. La configuración generalmente depende del entorno del servidor y hacer que sea configurable con una variable env es bueno. – akostadinov

2

hecho que no era necesario modificar cualquier configuraciones por defecto. Usted acaba de volver a compilar el archivo de activos.

eliminar públicas/activos

1.rake activos: RAILS_ENV clobber = producción

activos compilan

2.rake activos: RAILS_ENV precompilación = producción

3. Reinicie el servidor, p. Ej. (Nginx)

+0

Esto funcionó para mí, pero tengo curiosidad de por qué? – SteveO7

+0

@ SteveO7, obviamente, los carriles usan activos pipleline en modo dev por defecto . –

1

En los carriles 5, la opción config.serve_static_files ha cambiado, por lo que ahora es necesario tener

config.public_file_server.enabled = true 

para servir activos a nivel local.

0

utilizo mina + puma + nginx para desplegar mis rieles 5 aplicación, llegué

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

cheque config/ambientes/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 este, configúrelo correccionamente

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

cosas funcionarán bien.

1

intento por debajo de código:

config/ambientes/production.rb

config.assets.compile = true 

continuación, ejecutar comandos:

RAILS_ENV=production rake assets:precompile 

luego empuje todo compila archivos y archivo de manifiesto al servidor.

0

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

rails assets:clobber assets:precompile RAILS_ENV=test 

a continuación:

ps axu | grep your-username 

encontrar spring server proceso y su PID y luego matar a través de:

kill <spring-server-PID> 
Cuestiones relacionadas