Agregar una nueva ruta de activos en Rails 3.1


78

¿Alguien sabe cómo agregar otra carpeta a la canalización de activos en Rails 3.1?

Me gustaría servir de app/assets/fontsla misma forma que app/assets/imagesse sirve.


Actualización: 5-7-2013

Solo para agregar algunas aclaraciones para las personas futuras que encuentren esta pregunta para agregar explícitamente una ruta de activos, en su archivo application.rb:

config.assets.paths << "#{Rails.root}/app/assets/fonts"

Sin embargo, dado que el camino anterior está bajo app/assets , no tiene que agregarla explícitamente, solo necesita reiniciar su aplicación de rieles para que Sprockets pueda recogerla.

Tendrá que agregar explícitamente rutas que estén fuera de app/assets, lib/assetso vendor/assets, y solo recuerde que, si bien Sprockets recoge nuevos archivos en carpetas que estaban presentes cuando se cargó su aplicación, en mi experiencia no recoge nuevas carpetas en las rutas de activos sin un reinicio.


config.assets.paths << "#{Rails.root}/app/assets/active_admin"no está funcionando para mí. Sigo recibiendo un error al intentar ver una determinada página después de la implementación en la etapa de prueba de que el .jsarchivo en esa carpeta no está compilado.
sixty4bit

Respuestas:


74

Andrew, en app/assets/fontsrealidad ya está en su ruta de carga de activos, junto con images. Por lo tanto, puede apuntar al activo de la misma manera:<%= asset_path('/Ubuntu/Ubuntu-R-webfont.eot') %> [1] o como quiera que haga referencia a sus imágenes.

Me tomó un tiempo asimilar esto también. Sigo sin saber qué sucede si hay un archivo con el mismo nombre en app/assets/fontsyapp/assets/images .

[1] Suponiendo que tienes una fuente en app/assets/fonts/Ubuntu/Ubuntu-R-webfont.eot


21
Por lo que vale, probé esto y no pareció funcionar. Entonces adiviné config.assets.paths << "#{Rails.root}/app/assets/fonts"y funcionó. Creo que tiene razón en que /assetsse supone que todo lo que aparece a continuación se incluye automáticamente, pero por alguna razón para mí estaba dando 404 hasta que agregué la línea de arriba a mi application.rbarchivo. Sin embargo, voy a aceptar su respuesta, porque creo que será correcta cuando se finalice el lanzamiento, y porque con este comentario agregado a cualquiera que lo lea puede resolverlo :)
Andrew

39
También me encontré con esto, y funciona con la configuración predeterminada, PERO los directorios se escanean durante la inicialización de la aplicación, por lo que si agrega una carpeta como fuentes después de que su servidor se esté ejecutando, obtendrá un 404. Así que siempre reinicie cuando agregue un directorio en su cartera de activos.
Martin Wawrusch

4
Para ampliar los archivos del mismo nombre: cuando hay conflictos de nombres, la primera ruta que aparece en la config.assets.pathsmatriz es el archivo que se elige. Esto se puede evitar utilizando el asset_path()asistente y especificando el directorio.
Joseph Ravenwolfe

1
tenga en cuenta que el problema del nombre duplicado normalmente no debería suponer un problema. los activos que se sirven tendrán un formato diferente normalmente, por lo que este problema no ocurriría. Además, la canalización de activos le da a los activos una semilla en el nombre. esto es A para romper el dinero local del navegador del usuario, pero también para asegurarse de que todos los archivos tengan un nombre único. en la precompilación (que se ejecuta en producción), se crea un archivo yaml en la aplicación que vincula los archivos generados a la ruta original. Esto permite un enlace rápido desde la denominación en código hasta el nombre del activo compilado. Esto al mismo tiempo evita los problemas de nombres duplicados.
yopefonic

Esto fue perfectamente respondido aquí: stackoverflow.com/a/10907276/1407541
Kopty

43

Andrew, Jason, estuvieron de acuerdo. FWIW puse esto en mi config / application.rb junto a

  # Enable the asset pipeline
config.assets.enabled = true
config.assets.paths << "#{Rails.root}/app/assets/fonts"

15
Por lo que he visto, la forma preferida de escribir esto es ahoraRails.root.join('app', 'assets', 'fonts')
Ross Allen

1
Un poco molesto cuando se busca en Google una forma de agregar realmente una nueva ruta de activos y la respuesta aceptada no cumple la tarea: p (Es posible que el autor de la pregunta no haya necesitado hacer eso, pero esto es lo que aparece en el Resultados de la búsqueda). Entonces ... +1 por responder la pregunta del título en lugar de resolver el problema del OP.
nzifnab

config.assets.paths << "# {Rails.root} / app / assets / fonts" funcionó para mí en Rails 3.2.13
dc10

@ dc10 El uso Rails.root.joindebe ser la forma en que lo haga, para ser flexible en todas las plataformas.
ocodo

8

Creando app/assets/imagesyapp/assets/fonts que se añadirá automáticamente a la ruta activos.

Abra la consola de rieles después de crearlos y verifique con:

y Rails.application.config.assets.paths 

( yes un atajo para el yamlmétodo)


3

Funciona sin agregar la ruta, pero tenga cuidado de usar un nombre de archivo válido para el activo.

url("#{asset_path 'fontawesome-webfont.eot'}?#iefix") format('embedded-opentype'),
...
url("#{asset_path 'fontawesome-webfont.svg'}#FontAwesome") format('svg');

Por ejemplo, en este caso, deje ?#iefixfuera del nombre del archivo de fuente


¡Gracias! Esta fue la causa de un activo: error de precompilación que comencé a ver después de agregar fuentes, lo que da como resultado un "¡rake abortado! Método indefinido" coincidencia "para nil: NilClass"
Geoff

¡Ups! En realidad, mi problema real se solucionó con esto: stackoverflow.com/questions/14775844/…
Geoff

2

Puedo confirmar que funciona sin agregar las nuevas rutas a la configuración en Rails 3.1.0.rc4 (y supuestamente superior). Reboté mi servidor, tú podrías hacer lo mismo.


1

Cree una assets/fontscarpeta y agregue alguna fuente en ella y use el tema en su archivo css de la siguiente manera

@font-face {
  font-family: Sawasdee;
  src: url(Sawasdee.ttf);
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.