2011-06-27 7 views
45

image_path devuelve una ruta solamente (sin host).¿Cómo obtengo una URL absoluta para un activo en Rails 3.1?

El helper url_for no aceptará una sola ruta, por lo que algo como url_for(image_path('image.png')) no funcionaría. Mientras que el url_for interno en ActionDispatch::Http::Url.url_for parece 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 funciona como url_for para las rutas para que pueda llamar al image_url('image.png') y obtener la URL absoluta dada a todas las default_url_options.

+1

este blog tiene un fragmento que puede usar: http://stick.gk2.sk/blog/2009/12/image_url-function-in-ruby-on-rails/ –

+0

@Spike: la deficiencia con ese enfoque es que ignora las opciones predeterminadas de url. Por ejemplo, no habría forma de anular los parámetros de solicitud deducidos manualmente o mediante un hash default_url_options en la configuración de la aplicación. –

+0

@SpikeGronim Esto no funcionará con trabajos retrasados ​​ya que la solicitud estará vacía – lulalala

Respuesta

5

Al parecer, desde hace poco, sass-rails ahora interpreta el comando image_url dentro de un archivo SCSS en la espera manera, resolviendo a la ubicación final de la imagen en cuestión.

+2

¿Hay alguna manera de hacer esto fuera de Sass? image_url' no funciona en vistas –

+0

No soy del todo –

+1

sí, aquí es donde lo he usado antes (un estilo en línea): '" background: url (# {asset_path ('[email protected] ')}) centro superior no-repeat; "' – courtsimas

14

Pruebe esto en su application_helper.rb (de uno de los comentarios en la página de Spike mencionados):

def image_url(source) 
    "#{root_url}#{image_path(source)}" 
end 
+12

Para eliminar la barra adicional: 'def image_url (fuente) " # {root_url [0 ...-1]} # {image_path (source)} " end' – iGEL

+0

Tuve problemas para usar esto en Rails 3.1 hasta que cambié el nombre a' url_for_image'. No estoy seguro, pero creo que el método 'image_url' se estaba viendo para como una ruta. –

+0

También tuve que cambiar el nombre del método image_url a get_image_url para hacer que esto funcione – tdewell

4

De Full url for an image-path in Rails 3

request.protocol + request.host_with_port + image_path('image.png') 

Puede incluso 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 
49
def image_url(source) 
    URI.join(root_url, image_path(source)) 
end 

esta manera se obtiene URL, ya sea usando assets_host o unirse con root_url.

+0

dónde pone este código? – Syl

+1

@Syl En un ayudante – tig

+1

para información debe agregar 'add_template_helper (MailerHelper)' al programa de correo para hacer que el ayudante funcione en 3.2 – Syl

7

Nuestros activos de producción y etapas están en s3/cloudfront ... pero no localmente/dev. Así que escribí esta (puede ser excesiva, y, probablemente, se puede 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 
+0

esta respuesta es ligeramente diferente si se utilizan turbo-piñones, por cierto. – courtsimas

0

Puede definir css con el URL absoluta cualquier imagen de fondo o de otros activos. Entonces puede generarlo dinámicamente siguiendo este How to get absolute image paths in your css files using sass/scss.

CSS

body { 
    background-image: image-url(background.png); 
} 

En el archivo de entorno cambia con la suya

config.action_controller.asset_host = "http://your.domain.com/" 

A continuación, el CSS se verá algo así:

body { 
    background-image: url(http://your.domain.com/assets/background.png); 
} 
Cuestiones relacionadas