web-dev-qa-db-fra.com

Obtenir l'URL absolue pour la pièce jointe Paperclip

Est-il possible d'obtenir l'URI absolu pour une pièce jointe Paperclip? Actuellement, le problème est que l'environnement de production est déployé dans un sous-URI (sur Passenger: RackBaseURI), mais <Paperclip attachment>.url renvoie l'URI relatif de l'application Rails (/system/images/...). Existe-t-il un moyen d'obtenir l'URI absolu pour les pièces jointes Paperclip?

J'utilise Paperclip v2.7 et Rails 3.2.8.

24
sleepy_keita

essayer

URI.join(request.url, @model.attachment_name.url)

ou

URI(request.url) + @model.attachment_name.url

C'est sûr si vous utilisez S3 ou une URL absolue.

Mise à jour: cette réponse est meilleure que la mienne;) https://stackoverflow.com/a/21027839/683157

28
kuboon
asset_url(model.attachment_name.url(:style))

Problème github pertinent

41
Chris Bosco

Selon cela problème github , il est plus propre d'utiliser ActionController::Base.asset_Host il en résulterait l'aide:

  def add_Host_prefix(url)
    URI.join(ActionController::Base.asset_Host, url)
  end

Cela suppose que vous avez dans chaque /config/environments/<environment>.rb déposer ce qui suit:

Appname::Application.configure do

  # ....

  config.action_controller.asset_Host = 'http://localhost:3000' # Locally

  # ....

end
18
Augustin Riedinger

La façon la plus largement applicable de le faire est de définir d'abord vos hôtes de ressources dans le fichier de configuration/environnement correspondant:

config.action_controller.asset_Host = "http://assethost.com"
config.action_mailer.asset_Host = "http://assethost.com"

Puis dans les vues et les mailers:

asset_url(model.attachment.url(:style))

Dans la console:

helper.asset_url(model.attachment.url(:style))

Dans un modèle:

ApplicationController.helpers.asset_url(model.attachment.url(:style))
6
Paul Odeon

Tu peux le faire:

<%= image_tag "#{request.protocol}#{request.Host_with_port}#{@model.attachment_name.url(:attachment_style)}" %>

Ou créez une méthode d'aide pour l'envelopper.

def absolute_attachment_url(attachment_name, attachment_style = :original)
  "#{request.protocol}#{request.Host_with_port}#{attachment_name.url(attachment_style)}"
end

Et utilisez-le comme ceci:

<%= image_tag absolute_attachment_url(attachment_name, :attachment_style)}" %>

Ex: Model = Person (@person), attachment_name = avatar, style =: thumb

<%= image_tag absolute_attachment_url(@person.avatar, :thumb)}" %>
5
iouri

Cela ne résout pas exactement le problème de l'affiche originale (cela fonctionne dans la vue, pas dans le modèle), mais peut être utile pour les personnes qui essaient "d'obtenir l'URL absolue pour la pièce jointe d'un trombone" dans leur vue: de la même manière que

image_tag(user.avatar.url(:large))

met l'image elle-même à votre vue,

image_url(user.avatar.url(:large))

renvoie uniquement l'URL dont vous aurez besoin si vous souhaitez créer un lien direct vers l'élément (par exemple, dans un link_to appel).

4
blahedo

Vous pouvez ajouter à votre application.rb (ou pour un environnement spécifique dans config/environments/*):

config.Paperclip_defaults = {
    url: "http://my.address.com/system/:class/:attachment/:id_partition/:style.:extension",
    path: ':Rails_root/public/system/:class/:attachment/:id_partition/:style.:extension',
}

Redémarrez et réimportez vos images.

PS: vous pouvez évidemment remplacer http://my.address.com par une variable d'environnement.

2
micred