ruby on rails - rails - Rieles 4: activos que no se cargan en producción
the asset is not present in the asset pipeline (18)
El comparador predeterminado para compilar 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 gemas:
Si tiene otros manifiestos o hojas de estilo individuales y archivos de JavaScript para incluir, puede agregarlos a la matriz de precompilació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
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í:
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => 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 directoriopublic/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í:
<%= 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 esta:
<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
).
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 rieles 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-compilation )
Lo que DEBES hacer:
1. Precompila 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
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 precompilado, pero lo agregué de todos modos. El .css y .css.erb aparentemente no ocurren automáticamente. El ^[^_]
excluye los parciales de ser compilados, 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.
En primer lugar, compruebe sus activos, es posible que haya algún error en la precompilación de los activos.
Para precompilar 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 precompilació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'']
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 precompilar los activos
RAILS_ENV=production bundle exec rake assets:precompile
¡La mejor de las suertes!
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.
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!
Hay dos cosas que debe cumplir para servir los activos en producción:
- Precompila los activos.
- Sirve 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, confíelo al control de código fuente (git), luego ejecute el programa de implementación, por ejemplo, capistrano. Esta no es una buena manera de enviar activos precompilados 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; }
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 compilar 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 compilar 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.
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.
Pude resolver este problema cambiando: config.assets.compile = false
a
config.assets.compile = true
en /config/environments/production.rb
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 precompilado.
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 rieles que está en una subcarpeta.
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 precompila
Si se configura la precompilació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
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'']
no se recomienda permitir a los capistrano precompilar los activos, ya que puede llevar mucho tiempo y muchas veces agotar el tiempo. Intenta precompilar 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 precompilados:
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.