ruby on rails - Rails 4: ¿Por qué las fuentes no se cargan en producción?
ruby-on-rails fonts (2)
No puedo cargar fuentes en mi aplicación Rails 4 en producción, normalmente funciona en desarrollo.
Los activos se precompilan en el servidor durante la implementación.
Tengo mis fuentes en
app/assets/fonts
Mi app.css:
@font-face {
font-family: ''WalkwayBoldRegular'';
src: url(''Walkway_Bold-webfont.eot'');
src: url(''Walkway_Bold-webfont.eot?#iefix'') format(''embedded-opentype''),
url(''Walkway_Bold-webfont.woff'') format(''woff''),
url(''Walkway_Bold-webfont.ttf'') format(''truetype''),
url(''Walkway_Bold-webfont.svg#WalkwayBoldRegular'') format(''svg'');
font-weight: normal;
font-style: normal;
}
En mi production.rb tengo:
config.assets.precompile << Proc.new { |path|
if path =~ //.(eot|svg|ttf|woff)/z/
true
end
}
Tuvimos este problema la semana pasada: el problema es que sus activos se compilarán para tener hash MD5 en ellos, mientras que su CSS estándar seguirá buscando sus nombres "estándar". Este es un problema con las imágenes y fuentes.
@font-face {
font-family: ''akagi'';
src: asset_url(''fonts/akagi-th-webfont.eot'');
src: asset_url(''fonts/akagi-th-webfont.eot?#iefix'') format(''embedded-opentype''),
asset_url(''fonts/akagi-th-webfont.woff'') format(''woff''),
asset_url(''fonts/akagi-th-webfont.ttf'') format(''truetype''),
asset_url(''fonts/akagi-th-webfont.svg#akagithin'') format(''svg'');
font-weight: 300;
font-style: normal;
}
Este es un ejemplo de cómo debería usar archivos scss para cargar activos dinámicamente. Estos archivos se compilan (antes de pulsar o durante el inicio) en sus archivos .css, todos con sus activos sincronizados correctamente.
Tuvimos un problema similar para ti con Heroku, y logramos que funcionase al poner nuestros archivos en /stylesheets/layout/fonts.css.scss y luego llamar
@import ''/layout/fonts'';
También llamamos a nuestra application.css -> application.css.scss para que admita la función @import
Aquí hay una forma genérica de solucionar este problema para cualquier biblioteca.
Reproducir error en local
Ejecutar servidor de rieles en producción
- En
rake assets:precompile
terminalrake assets:precompile
Esto en
config/environments/production.rb
# Rails 4 production # config.serve_static_files = true # Rails 5, Uncomment to run production on local # config.log_level = :debug config.public_file_server.enabled = true
- En el terminal
RAILS_ENV=production rails s
- En
- Debería ver un error en el navegador web
Override familia de fuentes
-
application.css
necesita ser renombrado aapplication.scss
ya que se usaráasset-url
Agregue fuentes para precompilar en el archivo
config/initializers/assets.rb
:Rails.application.config.assets.precompile << //.(?:svg|eot|woff|ttf)$/
Busque la definición de la cara de la fuente dentro de su biblioteca CSS y cópielo a
application.scss
. Debería ser algo así como:@font-face { font-family: ''my-library''; src: url(''../fonts/my-library.eot''); src: url(''../fonts/my-library.eot?#iefix'') format(''embedded-opentype''), url(''../fonts/my-library.woff2'') format(''woff2''), url(''../fonts/my-library.ttf'') format(''truetype''), url(''../fonts/my-library.woff'') format(''woff''), url(''../fonts/my-library.svg?#my-library'') format(''svg''); font-weight: normal; font-style: normal; }
Cambiar a:
@font-face { font-family: ''my-library''; src: asset-url(''my-library/fonts/my-library.eot''); src: asset-url(''my-library/fonts/my-library.eot?#iefix'') format(''embedded-opentype''), asset-url(''my-library/fonts/my-library.woff2'') format(''woff2''), asset-url(''my-library/fonts/my-library.ttf'') format(''truetype''), asset-url(''my-library/fonts/my-library.woff'') format(''woff''), asset-url(''my-library/fonts/my-library.svg?#my-library'') format(''svg''); font-weight: normal; font-style: normal; }
Qué cambios se hicieron
- Usar
asset-url
lugar deurl
- Cambie
../fonts
o similar a una ruta queasset-url
comprenda.
Qué camino poner en assets-url
Para saber qué camino entiende asset-url
, vaya a la consola de rails e ingrese Rails.application.assets.paths
. Obtendrás algo como:
[
''/path/1'',
''/path/2'',
''/path/3'',
]
Si tus fuentes están en /path/2/my-library/fonts/
entonces usa asset-url(''my-library/fonts/my-library.eot'')
.
es decir, elimina la ruta de acceso de la parte que encontró en Rails.application.assets.paths
.
Compruebe que escribió el camino correcto
En la consola de Rails en desarrollo:
helper.asset_url(''my-library/fonts/my-library.eot'')
Debería regresar:
"/assets/my-library/fonts/my-library-2517b97e2c0e1e6c8ceb9dd007015f897926bc504154137281eec4c1a9f9bdc9.eot"
Tenga en cuenta el final /assets/
y el resumen en la última parte.