Rails 4: los activos no se cargan en producción


Estoy tratando de poner mi aplicación en producción y las rutas de recursos de imagen y 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 de esta manera: <%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
  • Antes de reiniciar unicorn, corro RAILS_ENV=production bundle exec rake assets:precompile y tiene éxito y veo los archivos de huellas digitales en el directorio public/assets.

Cuando navegue a mi sitio, obtengo un error 404 not found para mysite.com/stylesheets/styles.css.

¿Qué estoy haciendo mal?

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

<%= stylesheet_link_tag    "bootstrap.min", media: "all", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag    "styles", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>

La fuente de generación es la siguiente:

<link data-turbolinks-track="true" href="/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
<link data-turbolinks-track="true" href="/stylesheets/styles.css" media="all" rel="stylesheet" />
<script data-turbolinks-track="true" src="/assets/application-0c647c942c6eff10ad92f1f2b0c64efe.js"></script>

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

Author: New Alexandria, 2013-09-09

18 answers

En rails 4 necesitas hacer los siguientes cambios:

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

Esto funciona conmigo. utilice el siguiente comando para precompilar assets

RAILS_ENV=production bundle exec rake assets:precompile

¡Mucha suerte!

 96
Author: Rameshwar Vyevhare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-27 22:59:47

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

Cambiándolo a true lo consiguió trabajando. Parece que de forma predeterminada Rails espera que haya configurado su servidor web front-end para manejar las solicitudes de archivos de la carpeta pública en lugar de proxy a la aplicación Rails. Tal vez usted ha hecho esto para sus archivos javascript, pero no sus hojas de estilo CSS?

(Véase la documentación de Rails 5 ). Como se señaló en los comentarios, con Rails 5 puede simplemente 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?.

 74
Author: davmac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-28 05:24:19

En /config/environments/production.rb Tuve que añadir esto:

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

El.js ya estaba siendo precompilado, pero lo agregué de todos modos. El .css y .css.erb aparentemente no sucede automáticamente. El ^[^_] excluye las parciales de ser compiladas's es una expresión regular.

Es un poco frustrante que los documentos indiquen claramente que la canalización de activos ESTÁ habilitada por defecto, pero no aclaran el hecho de que solo se aplica a los javascript.

 31
Author: emersonthis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-27 03:26:00

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

Actualización (junio 24, 2018): Este método crea una vulnerabilidad de seguridad si la versión de los piñones que está utilizando es menor que 2.12.5, 3.7.2 o 4.0.0.beta8

 21
Author: Yanofsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-25 01:11:29

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

config.public_file_server.enabled = true

Por defecto, Rails 5 viene con esta línea de configuración:

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

Por lo tanto, necesitará establecer la variable de entorno RAILS_SERVE_STATIC_FILES en true.

 10
Author: ytbryan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-04 12:24:35

Hay 2 cosas que debe lograr para servir a los activos en la producción:

  1. Precompilar los activos.
  2. Sirva los activos en el servidor al navegador.

1) Para precompilar los activos, tiene varias opciones.

  • Puede ejecutar rake assets:precompile en su máquina local, confirmarlo en el control de código fuente (git) y luego ejecutar el programa de implementación, por ejemplo capistrano. Esta no es una buena manera de comprometer activos precompilados a SCM.

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

El código en una tarea para capistrano se verá 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 servidores de producción, debe servirlos en el navegador.

De nuevo, tienes varias opciones.

  • Encienda el archivo estático de Rails que sirve en config/environments/production.rb

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

    El uso de Rails para servir archivos estáticos matará el rendimiento de su 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;
    }
    
 9
Author: Châu Hồng Lĩnh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-10 07:26:42

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

Si usa stylesheet_link_tag entonces se generará el enlace correcto a su hoja de estilos

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

 4
Author: Frederick Cheung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-10 10:59:11

Cambia tu Producción.rb file line

config.assets.compile = false

Hacia

config.assets.compile = true

Y también añadir

config.assets.precompile =  ['*.js', '*.css', '*.css.erb']
 3
Author: Jassa Mahal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-25 11:33:06

Estoy ejecutando Ubuntu Server 14.04, Ruby 2.2.1 y Rieles 4.2.4 he seguido implementar turorial de DigitalOcean y salió todo bien, pero cuando voy al navegador y escriba la dirección IP de mi VPS mi aplicación está cargado, pero sin estilos y javascript.

La aplicación se ejecuta con Unicorn y Nginx. Para solucionar este problema ingresé a mi servidor usando SSH con mi usuario 'deployer' y vaya a mi ruta de aplicación que es '/inicio / deployer / aplicaciones / blog' y ejecute el siguiente comando:

RAILS_ENV=production bin/rake assets:precompile

Entonces solo reinicio el VPS y eso es todo! ¡Funciona para mí!

Espero que pueda ser útil para alguien más!

 2
Author: Alex Ventura,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-09 05:51:58

Si precompile está configurado, NO necesita

config.assets.compile = true

Ya que esto es para servir activos en vivo.

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

development:
    secret_key_base: '83d141eeb181032f4070ae7b1b27d9ff'

Necesita entrada para el entorno de producción

 2
Author: xxjjnn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-09 20:12:18

Lo que NO DEBES hacer:

Algunos de mis colegas anteriores le han recomendado que haga esto:

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

La tubería de activos de rails dice del enfoque anterior:

Este modo utiliza más memoria, funciona más mal que el predeterminado y no se recomienda. Ver aquí: (http://edgeguides.rubyonrails.org/asset_pipeline.html#live-compilation)

Lo que debes hacer:

1. Precompilar su activo.

RAILS_ENV=production rake assets:precompile

2. Añade esos archivos a git.

git add –all

3. Empuja hacia heroku.

git push origin master

 2
Author: BKSpurgeon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-11 03:08:48

El matcher predeterminado para compilar archivos incluye la aplicación.js, solicitud.css y todos los archivos que no sean JS / CSS (esto incluirá todos los activos de imagen automáticamente) de las carpetas de app / assets, incluidas sus gemas:

Si tiene otros manifiestos o hojas de estilo individuales y archivos JavaScript para incluir, puede agregarlos a la matriz precompilada en config/inicializadores/activos.rb:

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

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

 1
Author: FreePender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-15 05:17:05

Encontré esto:

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

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 establezca env RAILS_SERVE_STATIC_FILES o usando Nginx para servir archivos estáticos. Add config.serve_static_assets = true seguirá funcionando, pero se eliminará en el futuro.

 1
Author: Daniel Wei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-29 04:14:24

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

Para precompilar activos en production ENV ejecute este comando:

RAILS_ENV=production rake assets:precompile

Si muestra error, elimine eso primero,

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

Ejemplo:

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

En aplicación.rb file set sequence of pre-compilation of assets

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']
 0
Author: Chitresh goyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-20 06:51:21

Puedo estar equivocado, pero los que recomiendan cambiar

config.assets.compile = true

El comentario en esta línea dice: #No recurrir a la canalización de activos si se pierde un activo precompilado.

Esto sugiere que al establecer esto en true no está solucionando el problema, sino más bien eludiéndolo y ejecutando la canalización cada vez. Esto seguramente debe matar a su rendimiento y derrotar el propósito de la tubería?

Tuve este mismo error y fue debido a la aplicación que se ejecuta en un sub carpeta que Rails no conocía.

Así que mi archivo css está en home/subcarpeta/app/public/.... pero rails estaba buscando en home / app / public/...

Intente mover su aplicación fuera de la subcarpeta o decirle a rails que está en una subcarpeta.

 0
Author: Brad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-16 16:23:21

No se recomienda dejar que capistrano haga assets precompilar, ya que puede tomar años y, a menudo, tiempo fuera. trate de hacer activos locales precompilar.

1st, establecido en config/application.po config.assets.initialize_on_precompile = false a continuación, hacer local RAILS_ENV=production bin/rake assets:precompile y agrega esos public / assets a git.

Y config/environments/development.rb, cambie su ruta de activos para evitar el uso de activos precompilados:

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

Si tiene un problema de conexión a la base de datos, significa que tiene un inicializador que usa la base de datos. una forma de evitarlo es establecer un nuevo entorno por producción duplicada.rb as maybe production2.rb, y en la base de datos.yml, add production2environment with development db setting. entonces haga

RAILS_ENV=production2 bin/rake assets:precompile

Si todavía se enfrenta a algún problema con los activos, por ejemplo, ckeditor, agregue el archivo js a config / initializers / assets.rb

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

 0
Author: James Tan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-09 16:22:18
location ~ ^/assets/ {
  expires 1y;
  add_header Cache-Control public;
  add_header ETag "";
}

Esto solucionó el problema para mí en la producción. Ponlo en la configuración de nginx.

 0
Author: Pedro Adame Vergara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-29 09:18:56

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

Igual que en tu caso, incluso solíamos reiniciar unicorn después de compilar los activos. Se notó que cuando unicorn se reinicia, solo se reinician sus 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 compilar activos, nos detuvimos y comenzamos unicorn para que el proceso maestro unicornio también se reinicie y que los activos correctos se estén sirviendo.
Detener y arrancar el unicornio trae alrededor de 10 segundos de tiempo de inactividad en comparación con reiniciar el unicornio. Esta es la solución que se puede utilizar cuando la solución a largo plazo es mover a puma de unicornio.

 0
Author: Bhavya Keniya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-14 14:20:41