Comment puis-je obtenir une URL absolue pour un actif dans Rails 3.1?

image_path renvoie uniquement un chemin d’access (pas d’hôte).

L’assistant url_for n’acceptera pas un seul chemin, donc quelque chose comme url_for(image_path('image.png')) ne fonctionnera pas. Alors que l’ url_for interne dans ActionDispatch::Http::Url.url_for semble faire l’affaire ( source ), il ne semble pas y avoir d’interface publique pour cela.

Comment devrais-je y aller? En fin de compte, ce serait bien d’avoir une fonction comme image_url qui fonctionne comme url_for pour les routes afin que je puisse appeler image_url('image.png') et obtenir l’URL absolue avec toutes les default_url_options .

 def image_url(source) URI.join(root_url, image_path(source)) end 

De cette façon, vous obtenez une URL en utilisant assets_host ou en vous joignant avec root_url.

Essayez ceci dans votre application_helper.rb (de l’un des commentaires sur la page listée dans Spike):

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

Nos ressources de production et de stockage sont sur s3 / cloudfront … mais pas localement / dev. Donc j’ai écrit ceci (peut être excessif, et peut probablement être simplifié):

  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 

Il semblerait que sass-rails interprète maintenant la commande image_url dans un fichier scss de la manière attendue, en résolvant l’emplacement final de l’image en question.

De l’ URL complète pour un chemin d’image dans Rails 3

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

Vous pouvez même créer un assistant pour le sécher, quelque chose comme

 def full_image_path(img_path) request.protocol + request.host_with_port + image_path(img_path) end 

Vous pouvez définir css avec une URL absolue pour toute image d’arrière-plan ou autres actifs. Donc, vous pouvez le générer dynamicment en suivant cette procédure . Comment obtenir des chemins d’image absolus dans vos fichiers CSS en utilisant sass / scss .

CSS

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

Dans votre environnement, modifiez-le avec le vôtre

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

Alors votre css ressemblera à quelque chose comme ça:

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