web-dev-qa-db-fra.com

Default_url dans Paperclip Broke avec la mise à niveau du pipeline d’actifs

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).

33
yellowreign
:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')

Ensuite, placez les images par défaut dans app/assets/images/

45
JofoCodin

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.

24
tfischbach

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">
15
Brian Hempel

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.

8
Yuichi Nakano

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

3
Joe Ritchey

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' }
2
zpieslak

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.

1
Mark

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é.

1
jeff durand

Supprimez simplement le / de /images/pic.png: images/pic.png

0
ibnukamy

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, ...
0
theturingmachine