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.
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
asset_url(model.attachment_name.url(:style))
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
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))
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)}" %>
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).
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.