web-dev-qa-db-ja.com

アセットパイプラインのアップグレードによるPaperclip BrokeのDefault_url

私はPaperclipを使用していて、私の添付ファイルの1つに次のようなdefault_urlオプションがあります。

:default_url => '/images/missing_:style.png'

ディレクトリが移動したため、アセットパイプラインは明らかにこれを好まない。これを処理するための最良の方法は何ですか?この写真には2つのスタイルがあります(:miniと:thumb)。

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

次に、デフォルトの画像をapp/assets/images /に配置します

45
JofoCodin

Rails 4。でのみテスト済み

本番環境で機能させるには、既存のファイルの名前をasset_pathヘルパーに渡す必要があります。したがって、"missing_:style.png"のようなプレースホルダーを含む文字列を渡すことは機能しません。回避策としてカスタム補間を使用しました。

# config/initializers/Paperclip.rb
Paperclip.interpolates(:placeholder) do |attachment, style|
  ActionController::Base.helpers.asset_path("missing_#{style}.png")
end

画像がimages/にある場合でも、パスの前にapp/assets/imagesを付ける必要があることに注意してくださいnot。次に、次のように使用します。

# app/models/some_model.rb
has_attached_file(:thumbnail,
                  :default_url => ':placeholder',
                  :styles => { ... })

正しいダイジェストハッシュを持つデフォルトのURLが本番環境で再生されるようになりました。

default_urlオプションもラムダを取りますが、補間はラムダの結果にのみ適用されるため、要求されたスタイルを決定する方法を見つけることができませんでした。

24
tfischbach

ビューですべてのペーパークリップ画像がimage_tag

<%= image_tag my_model.attachment.url(:icon) %>

そうすれば、ペーパークリップのすべての:crazy :symbol :interpolationは、Railsがパイプラインのアセットに解決しようとする前に、URL文字列に発生します。

また、:default_urlはアセット互換です... missing_icon.pngapp/assets/images/missing_icon.pngの場合、:default_urlは単に"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

アセットでエラーが発生しました(単一のスタイルでも):プリコンパイル

:default_url => ActionController::Base.helpers.asset_path('missing.png')

だから私はこのような方法に夢中

# 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

私は複数のスタイルを試しませんでしたが、これは私の状況ではうまくいきます。

8
Yuichi Nakano

これは私のために働きます:

has_attached_file :avatar, :styles => { :small => "52x52",
:medium => "200x200>", :large=> "300x300", :thumb => "100x100>" },
                              :default_url => "missing_:style.png"

次の名前のアセット/画像フォルダーに画像を配置するだけです:missing_large.png、missing_medium.png、missing_small.png、missing_thumb.png

3
Joe Ritchey

Rails 4.0.0およびPaperclip 4.1.1では、これは私にとってはうまくいきました:

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

モデルファイルで、次の行を変更します。

has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"

これを削除することによって:

/images/

各スタイルのフォルダーをこの例の媒体と親指でassests/imagesに作成し、missing.pngという名前の画像をそこに配置します(もちろん、モデルのファイル名と一致する限り、任意の名前を付けます) )

私のために働いた。

1
Mark

結局、次のようなものを使わなければなりませんでした。

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

アセットを静的にコンパイルしましたが、本番環境でエラーが発生していました。これは役に立ちました。

1
jeff durand

//images/pic.pngから削除するだけです:images/pic.png

0
ibnukamy

カスタム補間器を使用してこの問題を解決しました。

使用を提案する他のソリューションからの問題

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

「missing_style.png」がプリコンパイルされていないというエラーが表示されるということです。

次のコードで初期化子を作成しました。

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

次に、私のモデルでは次のようにします:

has_attached_file :image, interpolator: Paperclip::AssetPipeline::Interpolator, ...
0