2011-07-21 11 views
46

¿Existe una forma incorporada de determinar si un activo existe sin recurrir a File.exists?(File.join(Rails.root, "foo", "bar", "baz")) y que examina las rutas de los activos?Rieles 3.1: determine si el activo existe

Mi aplicación va y obtiene imágenes de un servidor remoto en una cola Resque; hasta que tengamos la imagen descargada, quiero servir una imagen de marcador de posición. Actualmente estoy usando File.exists ... pero esto significa codificar una ruta, que es una mierda, o mirar a través de las rutas de los activos configurados. Parece que ya debería estar allí, pero no puedo encontrarlo en los documentos.

+2

Parece que la respuesta de Joe es bang. ¿Vas a marcarlo como correcto? –

Respuesta

68

Dada una imagen en app/assets/images/lolshirts/theme/bg-header.png,

Rails.application.assets.find_asset 'lolshirts/theme/bg-header.png' 
=> #> Sprockets::StaticAsset:0x80c388ec pathname="/Users/joevandyk/projects/tanga/sites/lolshirts/app/assets/images/lolshirts/theme/bg-header.png", mtime=2011-10-07 12:34:48 -0700, digest="a63cc84aca38e2172ae25de3d837c71a"> 

Rails.application.assets.find_asset 'notthere.png' 
=> nil 
+4

Solo una nota ... Si pasa una ruta con una barra diagonal, obtendrá una excepción si el activo no existe en lugar del bonito 'nil' – dwhite

+0

@dwhite Passing '/notthere.png' todavía produce una 'nil' on Rails 3.2 –

+0

Esto no parece funcionar en producción https://github.com/mileszs/wicked_pdf/issues/476 – DannyB

2

Por favor ver la respuesta aquí para una discusión sobre por qué find_asset no siempre funciona:

Include Assets Only If They Exist

+0

Creo que esto sería más útil como un comentario sobre la respuesta aceptada - tal como está, no responde la pregunta. – sevenseacat

30

Dado que esta sigue siendo la pregunta principal al buscar Google, y como la respuesta aceptada no funciona correctamente en producción (al menos en algunos casos), aquí está la solución que funciona para mí (Rails 4.2.5.1):

def asset_exist?(path) 
    if Rails.configuration.assets.compile 
    Rails.application.precompiled_assets.include? path 
    else 
    Rails.application.assets_manifest.assets[path].present? 
    end 
end 

Esto se copia de this github issue

+0

Votación máxima. Esto funciona en Rails 4.2 – Puce

+4

Probado en Rails 5.0.0 y funciona también. ¡Gracias! – rapcal

Cuestiones relacionadas