私はPaperclipを使用していて、私の添付ファイルの1つに次のようなdefault_urlオプションがあります。
:default_url => '/images/missing_:style.png'
ディレクトリが移動したため、アセットパイプラインは明らかにこれを好まない。これを処理するための最良の方法は何ですか?この写真には2つのスタイルがあります(:miniと:thumb)。
:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')
次に、デフォルトの画像をapp/assets/images /に配置します
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
オプションもラムダを取りますが、補間はラムダの結果にのみ適用されるため、要求されたスタイルを決定する方法を見つけることができませんでした。
ビューですべてのペーパークリップ画像がimage_tag
。
<%= image_tag my_model.attachment.url(:icon) %>
そうすれば、ペーパークリップのすべての:crazy :symbol :interpolation
は、Railsがパイプラインのアセットに解決しようとする前に、URL文字列に発生します。
また、:default_url
はアセット互換です... missing_icon.pngがapp/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">
アセットでエラーが発生しました(単一のスタイルでも):プリコンパイル
: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
私は複数のスタイルを試しませんでしたが、これは私の状況ではうまくいきます。
これは私のために働きます:
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
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' }
モデルファイルで、次の行を変更します。
has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
これを削除することによって:
/images/
各スタイルのフォルダーをこの例の媒体と親指でassests/imagesに作成し、missing.pngという名前の画像をそこに配置します(もちろん、モデルのファイル名と一致する限り、任意の名前を付けます) )
私のために働いた。
結局、次のようなものを使わなければなりませんでした。
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
アセットを静的にコンパイルしましたが、本番環境でエラーが発生していました。これは役に立ちました。
/
を/images/pic.png
から削除するだけです:images/pic.png
カスタム補間器を使用してこの問題を解決しました。
使用を提案する他のソリューションからの問題
: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, ...