Rieles 4: activos que no se cargan en producción

Intento poner mi aplicación en producción e imagen y las rutas de los activos CSS no funcionan.

Esto es lo que estoy haciendo actualmente:

  • Los activos de imagen viven en /app/assets/images/image.jpg
  • Las hojas de estilo viven en /app/assets/stylesheets/style.css
  • En mi diseño, hago referencia al archivo css así: true %>
  • Antes de reiniciar el unicornio, ejecuto RAILS_ENV=production bundle exec rake assets:precompile y tiene éxito y veo los archivos de huellas dactilares en el directorio public/assets .

Cuando navego a mi sitio, mysite.com/stylesheets/styles.css error 404 no encontrado para mysite.com/stylesheets/styles.css .

¿Qué estoy haciendo mal?

Actualización: en mi diseño, se ve así:

  true %>  true %>  true %> 

La fuente de generación es esta:

    

Parece que Rails no está buscando correctamente los archivos css comstackdos. Pero es muy confuso por qué está funcionando correctamente para javascripts (observe la ruta /assets/****.js ).

En rails 4, debe realizar los cambios a continuación:

 config.assets.compile = true config.assets.precompile = ['*.js', '*.css', '*.css.erb'] 

Esto funciona conmigo use el siguiente comando para precomstackr los activos

 RAILS_ENV=production bundle exec rake assets:precompile 

¡La mejor de las suertes!

Acabo de tener el mismo problema y encontré esta configuración en config / environments / production.rb:

 # Rails 4: config.serve_static_assets = false # Or for Rails 5: config.public_file_server.enabled = false 

Cambiarlo a true hizo funcionar. Parece que, de forma predeterminada, Rails espera que haya configurado su servidor web front-end para gestionar las solicitudes de archivos fuera de la carpeta pública en lugar de enviarlas a la aplicación Rails. Tal vez haya hecho esto para sus archivos javascript, pero no sus hojas de estilo CSS.

( Consulte la documentación de Rails 5 ). Como se indicó en los comentarios, con Rails 5 puede establecer la variable de entorno RAILS_SERVE_STATIC_FILES , ya que la configuración predeterminada es config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present? .

En /config/environments/production.rb tuve que agregar esto:

 Rails.application.config.assets.precompile += %w( *.js ^[^_]*.css *.css.erb ) 

El .js ya estaba precomstackdo, pero lo agregué de todos modos. El .css y .css.erb aparentemente no ocurren automáticamente. El ^[^_] excluye los parciales de ser comstackdos, es una expresión regular.

Es un poco frustrante que los documentos indiquen claramente que el inventario de activos está habilitado por defecto, pero no aclara el hecho de que solo se aplica a JavaScript.

Pude resolver este problema cambiando: config.assets.compile = false a
config.assets.compile = true en /config/environments/production.rb

Actualización (24 de junio de 2018) : este método crea una vulnerabilidad de seguridad si la versión de Sprockets que está utilizando es inferior a 2.12.5, 3.7.2 o 4.0.0.beta8

Para Rails 5, debe habilitar el siguiente código de configuración:

config.public_file_server.enabled = true

Por defecto, Rails 5 se envía con esta línea de configuración:

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?

Por lo tanto, deberá establecer la variable de entorno RAILS_SERVE_STATIC_FILES en verdadero.

Hay dos cosas que debe cumplir para servir los activos en producción:

  1. Precomstack los activos.
  2. Sirve los activos en el servidor al navegador.

1) Para precomstackr los activos, tiene varias opciones.

  • Puede ejecutar rake assets:precompile en su máquina local, confíelo al control de código fuente (git), luego ejecute el progtwig de implementación, por ejemplo, capistrano. Esta no es una buena manera de enviar activos precomstackdos a SCM.

  • Puede escribir una tarea de rake que ejecute RAILS_ENV=production rake assets:precompile en los servidores de destino cada vez que despliegue su aplicación Rails en producción, antes de reiniciar el servidor.

El código en una tarea para capistrano será similar a esto:

 on roles(:app) do if DEPLOY_ENV == 'production' execute("cd #{DEPLOY_TO_DIR}/current && RAILS_ENV=production rvm #{ruby_string} do rake assets:precompile") end end 

2) Ahora, tiene los activos en los servidores de producción, debe enviarlos al navegador.

De nuevo, tienes varias opciones.

  • Activar el servicio de archivos estáticos de Rails en config / environments / production.rb

     config.serve_static_assets = true # old or config.serve_static_files = true # new 

    Usar Rails para servir archivos estáticos matará el rendimiento de la aplicación Rails.

  • Configure nginx (o Apache) para servir archivos estáticos.

    Por ejemplo, mi nginx que fue configurado para trabajar con Puma se ve así:

     location ~ ^/(assets|images|fonts)/(.*)$ { alias /var/www/foster_care/current/public/$1/$2; gzip on; expires max; add_header Cache-Control public; } 

Rails 4 ya no genera la versión sin huellas dactilares del activo: stylesheets / style.css no se generará para usted.

Si usa stylesheet_link_tag, se generará el enlace correcto a su hoja de estilo

Además, styles.css debe estar en config.assets.precompile que es la lista de cosas que se precomstack

cambie su línea de archivo Production.rb

 config.assets.compile = false 

dentro

 config.assets.compile = true 

y también agregar

 config.assets.precompile = ['*.js', '*.css', '*.css.erb'] 

Estoy ejecutando Ubuntu Server 14.04 , Ruby 2.2.1 y Rails 4.2.4. He seguido un despliegue turorial de Digital Ocean y todo ha ido bien, pero cuando voy al navegador e ingreso la dirección IP de mi VPS mi aplicación se carga pero sin estilos y javascript

La aplicación se está ejecutando con Unicorn y Nginx . Para solucionar este problema ingresé a mi servidor usando SSH con mi usuario ‘deployer’ y voy a la ruta de mi aplicación que es ‘/ home / deployer / apps / blog’ y ejecuto el siguiente comando:

 RAILS_ENV=production bin/rake assets:precompile 

¡Entonces reinicié el VPS y listo! ¡Esto funciona para mi!

Espero que pueda ser útil para otra persona!

Si se configura la precomstackción, NO es necesario

 config.assets.compile = true 

como esto es para servir activos en vivo.

Nuestro problema era que solo teníamos una clave secreta de desarrollo establecida en config/secrets.yml

 development: secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff' 

Necesita entrada para el entorno de producción

Lo que NO DEBES hacer:

Algunos de mis colegas anteriores te han recomendado que hagas esto:

 config.serve_static_assets = true ## DON”T DO THIS!! config.public_file_server.enabled = true ## DON”T DO THIS!! 

La cartera de activos de Rails dice del enfoque anterior:

Este modo usa más memoria, funciona peor que el predeterminado y no es recomendable. Ver aquí: ( http://edgeguides.rubyonrails.org/asset_pipeline.html#live-comstacktion )

Lo que DEBES hacer:

1. Precomstack tus activos.

RAILS_ENV=production rake assets:precompile

2. Agregue esos archivos a git.

git add –all

3. Empujar a heroku.

git push origin master

El comparador predeterminado para comstackr archivos incluye application.js, application.css y todos los archivos no JS / CSS (esto incluirá todos los activos de imagen automáticamente) de las carpetas de aplicaciones / activos, incluidas sus gems:

Si tiene otros manifiestos o hojas de estilo individuales y archivos de JavaScript para incluir, puede agregarlos a la matriz de precomstackción en config / initializers / assets.rb:

 Rails.application.config.assets.precompile += ['admin.js', 'admin.css', 'swfObject.js'] 

http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets

Encontró esto:

La opción de configuración config.serve_static_assets ha sido renombrada a config.serve_static_files para aclarar su función.

en config/environments/production.rb :

 # Disable serving static files from the `/public` folder by default since # Apache or NGINX already handles this. config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? 

Así que configure env RAILS_SERVE_STATIC_FILES o use Nginx para servir archivos estáticos. Agregar config.serve_static_assets = true seguirá funcionando, pero se eliminará en el futuro.

En primer lugar, compruebe sus activos, es posible que haya algún error en la precomstackción de los activos.

Para precomstackr los activos en producción ENV, ejecute este comando:

 RAILS_ENV=production rake assets:precompile 

Si muestra un error, quítelo primero,

En caso de error de “variable indefinida”, cargue ese archivo variable antes de usarlo en otro archivo.

ejemplo:

 @import "variables"; @import "style"; 

en el archivo application.rb establece la secuencia de precomstackción de los activos

ejemplo:

 config.assets.precompile += [ 'application.js', 'admin.js', 'admin/events.js', 'admin/gallery.js', 'frontendgallery.js'] config.assets.precompile += [ 'application.css', 'admin.css','admin/events.css', 'admin/gallery.css', 'frontendgallery.css'] 

Puedo estar equivocado pero aquellos que recomiendan cambiar

config.assets.compile = true

El comentario en esta línea dice: #No recurrir a la cartera de activos si se pierde un activo precomstackdo.

Esto sugiere que estableciendo esto en verdadero no está solucionando el problema, sino evitándolo y ejecutando la canalización todo el tiempo. Esto seguramente debe matar su rendimiento y derrotar el propósito de la tubería?

Tuve el mismo error y fue debido a que la aplicación se ejecutaba en una subcarpeta que los rails no conocían.

Así que mi archivo css estaba en la página de inicio / subcarpeta / app / public / …. pero los raíles estaban buscando en la página de inicio / app / public / …

intente mover su aplicación fuera de la subcarpeta o indicarle a los Rails que está en una subcarpeta.

no se recomienda permitir a los capistrano precomstackr los activos, ya que puede llevar mucho tiempo y muchas veces agotar el tiempo. Intenta precomstackr los activos locales.

Primero, config.assets.initialize_on_precompile = false en config / application.rb config.assets.initialize_on_precompile = false luego haga local RAILS_ENV=production bin/rake assets:precompile y agregue esos public / assets a git.

y config / environments / development.rb, cambie la ruta de su activo para evitar el uso de activos precomstackdos:

config.assets.prefix = '/dev-assets'

Si tiene un problema de conexión de DB, significa que tiene un inicializador que usa db. Una forma de evitarlo es establecer un nuevo entorno mediante production.rb duplicado como, por ejemplo, production2 .rb, y en database.yml, agregar el entorno production2 con la configuración db de desarrollo . entonces hazlo

RAILS_ENV=production2 bin/rake assets:precompile

si aún enfrenta algún problema con los activos, por ejemplo, ckeditor, agregue el archivo js en config / initializers / assets.rb

Rails.application.config.assets.precompile += %w( ckeditor.js )

 location ~ ^/assets/ { expires 1y; add_header Cache-Control public; add_header ETag ""; } 

Esto me solucionó el problema en la producción. Ponlo en la configuración nginx.

Incluso enfrentamos el mismo problema donde RAILS_ENV=production bundle exec rake assets:precompile tuvo éxito pero las cosas no funcionaron como se esperaba.
Descubrimos que el unicornio era el principal culpable aquí.

Igual que su caso, incluso solíamos reiniciar Unicorn después de comstackr los activos. Se observó que cuando se reinicia el unicornio, solo se reinician los procesos de trabajo y no el proceso maestro.
Esta es la razón principal por la que no se sirven los activos correctos.

Más tarde, después de comstackr los activos, nos detuvimos e iniciamos el unicornio para que el proceso maestro de unicornio también se reiniciara y los activos correctos fueran atendidos.
Detener e iniciar el unicornio trae alrededor de 10 segundos en el tiempo de inactividad en comparación con reiniciar el unicornio. Esta es la solución alternativa que se puede usar donde, como solución a largo plazo, se pasa al puma del unicornio.