ruby on rails - que - ¿Cómo obtengo una URL absoluta para un activo en Rails 3.1?
ruby on rails tutorial (6)
image_path
devuelve una ruta (sin host).
El url_for
helper no aceptará una sola ruta, por lo que algo como url_for(image_path(''image.png''))
no funcionaría. Si bien el url_for
interno en ActionDispatch::Http::Url.url_for
parecería ser el truco ( source ), no parece haber una interfaz pública para él.
¿Cómo debo hacerlo? En última instancia, sería bueno tener una función como image_url
que funcione como url_for
para las rutas para poder llamar a image_url(''image.png'')
y obtener la URL absoluta dada todas image_url(''image.png'')
.
Desde la URL completa para una ruta de imagen en Rails 3
request.protocol + request.host_with_port + image_path(''image.png'')
Incluso puedes crear un ayudante para SECARlo, algo así como
def full_image_path(img_path)
request.protocol + request.host_with_port + image_path(img_path)
end
Nuestros activos de producción y puesta en escena están en s3 / cloudfront ... pero no localmente / dev. Así que escribí esto (puede ser exagerado, y probablemente se pueda simplificar):
def get_digest_file(source)
return asset_path(source.to_s.downcase) unless Rails.application.config.assets.digests.present?
return ActionController::Base.asset_host + "/assets/" + Rails.application.config.assets.digests[source.to_s.downcase]
end
Parece que, hasta hace poco, sass-rails
ahora interpreta el comando image_url
dentro de un archivo scss de la manera esperada, resolviendo a la ubicación final de la imagen en cuestión.
Pruebe esto en su application_helper.rb
(de uno de los comentarios en la página de Spike):
def image_url(source)
"#{root_url}#{image_path(source)}"
end
Puede definir css con url absoluta para cualquier imagen de fondo u otros activos. Entonces puede generarlo dinámicamente siguiendo este Cómo obtener caminos de imagen absolutos en sus archivos CSS usando sass / scss .
CSS
body {
background-image: image-url(background.png);
}
En tu archivo de entorno, cámbialo con los tuyos
config.action_controller.asset_host = "http://your.domain.com/"
Entonces tu CSS se verá algo así:
body {
background-image: url(http://your.domain.com/assets/background.png);
}
def image_url(source)
URI.join(root_url, image_path(source))
end
De esta forma, obtienes url ya sea usando assets_host
o uniéndote con root_url.