Estoy tratando de poner mi aplicación en producción y las rutas de activos de imagen y CSS no funcionan.
Esto es lo que estoy haciendo actualmente:
- Los activos de imagen se encuentran en /app/assets/images/image.jpg
- Las hojas de estilo se encuentran 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, ejecuto
RAILS_ENV=production bundle exec rake assets:precompile
y funciona correctamente y veo los archivos con huellas digitales en elpublic/assets
directorio.
Cuando navego a mi sitio, obtengo un 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é funciona correctamente para los javascripts (observe la /assets/****.js
ruta).
ruby-on-rails
ruby
asset-pipeline
ruby-on-rails-4
emersonthis
fuente
fuente
stylesheet_link_tag
.<%= stylesheet_link_tag "style", media: "all", "data-turbolinks-track" => true %>
public/assets
y 2. verificar si no hay otra instrucción en algún lugar tratando de cargar ese archivo css (presumiblemente codificado).home {background: #FFF url(<%= image_path 'hippopotamus.jpg' %>) no-repeat; }
realidad se puede reemplazar en sprocket con.home {background: #FFF url(image-path('hippopotamus.jpg')) no-repeat; }
. Quizás puedas intentarlo si esto te ayuda.Respuestas:
En rails 4, debe realizar los cambios a continuación:
Esto funciona conmigo. use el siguiente comando para precompilar activos
¡La mejor de las suertes!
fuente
config.serve_static_files
y configurar el alias en Apache y nginx para tratarassets
.Acabo de tener el mismo problema y encontré esta configuración en config / environment / production.rb:
Cambiándolo para
true
que funcione. Parece que, de forma predeterminada, Rails espera que haya configurado su servidor web front-end para manejar solicitudes de archivos fuera de la carpeta pública en lugar de enviarlos a la aplicación Rails. ¿Quizás ha hecho esto para sus archivos javascript pero no para sus hojas de estilo CSS?( Consulte la documentación de Rails 5 ). Como se señaló en los comentarios, con Rails 5 puede configurar la
RAILS_SERVE_STATIC_FILES
variable de entorno, ya que la configuración predeterminada esconfig.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
.fuente
config.serve_static_assets
ha sido renombrada paraconfig.serve_static_files
aclarar su función (simplemente habilita el servicio de todo en lapublic
carpeta y no está relacionada con la canalización de activos). Elserve_static_assets
alias se eliminará en Rails 5.0. Migre sus archivos de configuración en consecuencia.config.serve_static_files
en Rails 4.2 yconfig.public_file_server.enabled
en Rails 5 . @see github.com/heroku/rails_serve_static_assets/blob/master/lib/…config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
para que pueda configurar esto de manera diferente para su entorno sin cambiar el código que está registrado en su SCM.En
/config/environments/production.rb
tuve que agregar esto:El .js ya se estaba compilando previamente, pero lo agregué de todos modos. El .css y .css.erb aparentemente no ocurren automáticamente. No
^[^_]
permite que los parciales se compilen: es una expresión regular.Es un poco frustrante que los documentos indiquen claramente que la canalización de activos está habilitada de forma predeterminada, pero no aclara el hecho de que solo se aplica a los javascripts.
fuente
Pude resolver este problema cambiando:
config.assets.compile = false
aconfig.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
fuente
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.fuente
passenger_env_var RAILS_SERVE_STATIC_FILES true;
en el bloque de ubicación de mi aplicación en mi archivo nginx.conf.Hay 2 cosas que debe lograr para servir los activos en producción:
1) Para precompilar los activos, tiene varias opciones.
Puede ejecutarlo
rake assets:precompile
en su máquina local, enviarlo al control de código fuente (git) y luego ejecutar el programa de implementación, por ejemplo, capistrano. Ésta no es una buena manera de comprometer activos precompilados en 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:
2) Ahora que tiene los activos en los servidores de producción, debe enviarlos al navegador.
Nuevamente, tiene varias opciones.
Active el servicio de archivos estáticos de Rails en config / environment / production.rb
El uso de Rails para entregar 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 se configuró para funcionar con Puma se ve así:
fuente
Rails 4 ya no genera la versión sin huellas digitales del activo: no se generarán las hojas de estilo / style.css.
Si lo usa
stylesheet_link_tag
, se generará el enlace correcto a su hoja de estiloAdemás
styles.css
debe estar enconfig.assets.precompile
cuál está la lista de cosas que están precompiladasfuente
<%= stylesheet_link_tag "styles", media: "all", "data-turbolinks-track" => true %>
¿Es esto incorrecto? ''<link data-turbolinks-track="true" href="https://stackoverflow.com/stylesheets/bootstrap.min.css" media="all" rel="stylesheet" />
Pero los archivos javascript son correctos! No entiendo por qué las mismas configuraciones funcionan para archivos .js pero no para .css.serve_static_files
está en desuso y se eliminará en Rails 5.1. Utilice en supublic_file_server.enabled = true
lugar.404
. ¿Resolviste esto?cambiar su línea de archivo Production.rb
dentro
y también agregar
fuente
Estoy ejecutando Ubuntu Server 14.04 , Ruby 2.2.1 y Rails 4.2.4 He seguido un despliegue turorial de DigitalOcean y todo salió bien, pero cuando voy al navegador e ingreso la dirección IP de mi VPS mi aplicación está cargada 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 fui a la ruta de mi aplicación, que es '/ home / deployer / apps / blog' y ejecuté el siguiente comando:
Luego reinicio el VPS y ¡listo! ¡Esto funciona para mi!
¡Espero que pueda ser útil para alguien más!
fuente
Si la precompilación está configurada, NO necesita
ya que esto es para servir activos en vivo.
Nuestro problema fue que solo teníamos la base de claves secretas de desarrollo configuradas en
config/secrets.yml
Necesita entrada para el entorno de producción
fuente
config.assets.precompile = ['*.js', '*.css', '*.css.erb']
y para ejecutarRAILS_ENV=production bundle exec rake assets:precompile
Lo que NO DEBE hacer:
Algunos de mis colegas anteriores le han recomendado que haga esto:
La canalización de activos de rieles dice del enfoque anterior:
Lo que DEBE hacer:
Precompile sus activos.
RAILS_ENV=production rake assets:precompile
Probablemente puedas hacer eso con una tarea de rastrillo.
fuente
http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets
fuente
En primer lugar, verifique sus activos, es posible que haya algún error en la compilación previa de los activos.
Para precompilar activos en producción ENV, ejecute este comando:
Si muestra un error, elimínelo primero,
En caso de error de "variable indefinida", cargue ese archivo de variable antes de usarlo en otro archivo.
ejemplo:
en el archivo application.rb, secuencia de precompilación de activos
ejemplo:
fuente
Encontró esto:
Se
config.serve_static_assets
ha cambiado el nombre de la opción de configuración aconfig.serve_static_files
para aclarar su función.en
config/environments/production.rb
:Así que configure env
RAILS_SERVE_STATIC_FILES
o useNginx
para servir archivos estáticos. Agregarconfig.serve_static_assets = true
seguirá funcionando, pero se eliminará en el futuro.fuente
No se recomienda dejar que capistrano realice la precompilación de activos, ya que puede llevar años y, a menudo, un tiempo de espera. intente hacer precompilación de activos locales.
Primero, configure en config / application.rb
config.assets.initialize_on_precompile = false
luego haga localRAILS_ENV=production bin/rake assets:precompile
y agregue esos activos públicos a git.y config / environment / development.rb, cambie la ruta de sus activos para evitar el uso de activos precompilados:
config.assets.prefix = '/dev-assets'
Si tiene un problema de conexión con la base de datos, significa que tiene un inicializador que utiliza la base de datos. una forma de evitarlo es establecer un nuevo entorno duplicando production.rb como quizás production2 .rb, y en database.yml, agregar el entorno de producción2 con la configuración de db de desarrollo . entonces hazlo
RAILS_ENV=production2 bin/rake assets:precompile
si todavía tiene 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 )
fuente
Puede que me equivoque, pero los que recomiendan cambiar
config.assets.compile = true
El comentario en esta línea dice: #No recurra a la canalización de activos si se pierde un activo precompilado.
Esto sugiere que al establecer esto en verdadero, no está solucionando el problema, sino más bien evitándolo y ejecutando la canalización cada vez. ¿Esto seguramente debe matar su desempeño y frustrar el propósito de la tubería?
Tuve este mismo error y se debió a que la aplicación se estaba ejecutando en una subcarpeta que Rails no conocía.
Entonces mi archivo css estaba en casa / subcarpeta / aplicación / público / .... pero rails estaba buscando en casa / aplicación / público / ...
intente sacar su aplicación de la subcarpeta o decirle a Rails que está en una subcarpeta.
fuente
Esto me solucionó el problema en producción. Ponlo en la configuración de nginx.
fuente
Incluso nos enfrentamos al mismo problema donde
RAILS_ENV=production bundle exec rake assets:precompile
tuvimos éxito, pero las cosas no funcionaron como se esperaba.Descubrimos que el unicornio era el principal culpable aquí.
Igual que en su caso, incluso solíamos reiniciar unicorn después de compilar los activos. Se notó que cuando se reinicia unicorn, 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 los activos, paramos e iniciamos unicorn para que el proceso maestro de unicornio también se reinicie y se sirvan los activos correctos.
Detener e iniciar el unicornio trae alrededor de 10 segundos de tiempo de inactividad en comparación con reiniciar el unicornio. Esta es la solución alternativa que se puede utilizar cuando, como solución a largo plazo, se pasa de unicornio a puma.
fuente