web-dev-qa-db-fra.com

Rails 3.1 URL absolue vers une image

J'utilise Rails 3.1. J'essaie de comprendre cela, et à ma grande surprise, il semble que Rails ne vient pas avec cette méthode du tout. Peut-être que je me trompe.

Quelqu'un peut-il montrer comment obtenir une URL absolue complète vers une image?

J'utilise asset_path(image.png) qui me donne le chemin relatif à utiliser dans l'application. J'ai essayé de faire une root_url + asset_path(image.png) mais cela me donne juste un http://localhost:3000//assets/image.png avec les doubles barres obliques

Quelqu'un a-t-il un moyen efficace de le faire?

31
alik

Voir la section Utilisation des hôtes de ressources dans la documentation . Vous devez spécifier un asset_Host. Vous pouvez également le construire dynamiquement à partir du chaînage des requêtes "#{request.protocol}#{request.Host_with_port}"

24
Simone Carletti

mettre ceci dans application_helper.rb

def asset_url asset
  "#{request.protocol}#{request.Host_with_port}#{asset_path(asset)}"
end

alors vous pouvez utiliser asset_url dans vos vues.

24
greggreg

Pour Rails 4, et peut-être plus tôt, utilisez:

config.action_mailer.asset_Host = 'https://assets.com'

par https://github.com/fphilipe/premailer-Rails/issues/16

11
Luke W

Dans mon config/environments/*.rb Je l'ai déjà adapté à chaque environnement:

config.domain = 'mysite.dev'

Il s'agissait donc simplement d'ajouter

config.action_controller.asset_Host = "http://" + config.domain

à chaque fichier. Ensuite asset_path se comportera miraculeusement comme si c'était asset_url.

6

Exemple de structure de dossiers.

app/
   assets/
      flags/
         32x32/
            en.png
         256x256/
            en.png

Si vous souhaitez générer un chemin d'image de drapeau absolu, nous pouvons ajouter à nos deux méthodes ApplicationHelper:

module ApplicationHelper

  # Generate flag path by locale
  # - locale. Can be "en", "it", etc.
  # - flag_size. Will be used to set folder size. Folder size can be "32x32", "256x256".
  # Return flag image path. Path will absolute
  def generate_flag_path_by_locale(locale, folder_size = "32")
    folder = "#{flag_size}x#{flag_size}"
    domain_absolute_path = generate_domain_absolute_path
    flag_path = ("#{domain_absolute_path}/assets/flags/#{folder}/#{locale}.png")

    return flag_path
  end

  # Generate domain absolute path
  def generate_domain_absolute_path
    request_protocol = request.protocol
    request_Host_with_port = request.Host_with_port
    domain_absolute_path = request_protocol + request_Host_with_port

    return domain_absolute_path
  end
end

Dans nos applications/view/products.html.erb. Nous devons appeler uniquement:

<% flag_path = generate_flag_path_by_locale("en") %> 

Résultat final:

http://my_domain.com:3000/assets/flags/32x32/en.png

0
d.danailov