J'utilise Paperclip et j'ai une option default_url comme celle-ci pour l'une de mes pièces jointes:
:default_url => '/images/missing_:style.png'
Le portefeuille d'actifs n'aime évidemment pas cela puisque les annuaires ont été déplacés. Quelle est la meilleure façon de gérer cela? J'ai deux styles pour cette image (: mini et: pouce).
:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')
Ensuite, placez les images par défaut dans app/assets/images/
Testé uniquement sur Rails 4.
Pour que cela fonctionne en production, nous devons transmettre le nom d'un fichier existant à l'assistant asset_path
. Passer une chaîne contenant un espace réservé tel que "missing_:style.png"
ne fonctionne donc pas. J'ai utilisé une interpolation personnalisée comme solution de contournement:
# config/initializers/Paperclip.rb
Paperclip.interpolates(:placeholder) do |attachment, style|
ActionController::Base.helpers.asset_path("missing_#{style}.png")
end
Notez que vous devez pas préfixer le chemin avec images/
même si votre image est située dans app/assets/images
. Alors utilisez-le comme:
# app/models/some_model.rb
has_attached_file(:thumbnail,
:default_url => ':placeholder',
:styles => { ... })
Maintenant, les URL par défaut avec les hachages de digest corrects sont lus en production.
L'option default_url
prend également un lambda, mais je n'ai pas trouvé de moyen de déterminer le style demandé, car les interpolations sont uniquement appliquées au résultat du lambda.
Assurez-vous simplement que dans vos vues toutes vos images Paperclip sont rendues avec image_tag
.
<%= image_tag my_model.attachment.url(:icon) %>
De cette façon, tout le :crazy :symbol :interpolation
de Paperclip sera passé à la chaîne d'URL avant que Rails ne tente de la résoudre en un actif dans le pipeline.
Assurez-vous également que votre :default_url
est compatible avec les actifs ... si missing_icon.png est dans app/assets/images/missing_icon.png , alors :default_url
doit être simplement "missing_:style.png"
<%= image_tag my_model.attachment.url(:icon) %>
# resolves to...
<%= image_tag "missing_icon.png" %>
# which in development resolves to...
<img src="/assets/missing_icon.png">
J'ai eu l'erreur (même pour un seul style) sur assets: précompiler avec
:default_url => ActionController::Base.helpers.asset_path('missing.png')
Alors j'ai accroché avec une méthode comme celle-ci
# supposing this is for avatar in User model
has_attached_file :avatar,
:styles => {..},
:default_url => lambda { |avatar| avatar.instance.set_default_url}
def set_default_url
ActionController::Base.helpers.asset_path('missing.png')
end
Je n'ai pas essayé plusieurs styles, mais cela fonctionne dans mon cas.
cela fonctionne pour moi:
has_attached_file :avatar, :styles => { :small => "52x52",
:medium => "200x200>", :large=> "300x300", :thumb => "100x100>" },
:default_url => "missing_:style.png"
placez simplement des images dans votre dossier assets/images nommés: missing_large.png, missing_medium.png, missing_small.png et missing_thumb.png
Dans Rails 4.0.0 et Paperclip 4.1.1, cela a fonctionné pour moi:
has_attached_file :avatar,
styles: { medium: '300x300#', small: '100x100#', thumb: '25x25#' },
default_url: ->(attachment) { 'avatar/:style.gif' },
convert_options: { all: '-set colorspace sRGB -strip' }
Dans votre fichier de modèle, modifiez cette ligne:
has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
en supprimant ceci:
/images/
Créez un dossier pour chaque style, dans cet exemple, medium et thumb, dans assests/images et placez-y une image appelée missing.png (ou le nom de votre choix, bien sûr, tant qu'elle correspond au nom de fichier du modèle). )
Travaillé pour moi.
J'ai fini par utiliser quelque chose comme ce qui suit.
DEFAULT_URL = "#{Rails.configuration.action_controller.asset_Host}#{Rails.configuration.assets.prefix}/:attachment/:style/missing.png"
has_attached_file :art, :styles => { :large => "398x398#", :medium => "200x200#", :small=>"100x100#", :smaller=>"50x50#", :smallest=>"25x25"}, :path=>"images/:attachment/:id/:style/:basename.:extension", :default_url => DEFAULT_URL
Je compile statiquement les actifs et recevais une erreur de production, cela m'a aidé.
Supprimez simplement le /
de /images/pic.png
: images/pic.png
J'ai résolu ce problème en utilisant un interpolateur personnalisé.
Le problème d'autres solutions suggérant d'utiliser
:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')
c’est que vous obtiendrez une erreur disant que "missing_style.png" n’est pas précompilé.
J'ai créé un initialiseur avec le code suivant:
module Paperclip
module AssetPipeline
module Interpolator
def self.interpolate(pattern, *args)
ActionController::Base.helpers.asset_path Paperclip::Interpolations.interpolate(pattern, *args)
end
end
end
end
Puis dans mon modèle je ferais:
has_attached_file :image, interpolator: Paperclip::AssetPipeline::Interpolator, ...