我正在使用Paperclip并为我的某个附件设置了一个default_url选项:
:default_url => '/images/missing_:style.png'
自从目录移动后,资产管道显然不喜欢这样。处理这个问题的最佳方法是什么?我对这张照片有两种风格(迷你和拇指)。
答案 0 :(得分:45)
:default_url => ActionController::Base.helpers.asset_path('missing_:style.png')
然后将默认图像放在 app / assets / images /
中答案 1 :(得分:24)
仅在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
的路径前添加前缀。然后使用它:
# app/models/some_model.rb
has_attached_file(:thumbnail,
:default_url => ':placeholder',
:styles => { ... })
现在,在生产中播放具有正确摘要哈希值的默认网址。
default_url
选项也采用lambda,但我找不到确定请求样式的方法,因为插值仅应用于lambda的结果。
答案 2 :(得分:15)
只需确保您的观看中的所有回形针图像都使用image_tag
呈现。
<%= image_tag my_model.attachment.url(:icon) %>
这样,在Rails尝试将其解析为管道中的资产之前,所有回形针的:crazy :symbol :interpolation
都会发生在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">
答案 3 :(得分:8)
我在资产上遇到了错误(即使是单一样式):使用
进行预编译: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
我没有尝试多种样式,但这适用于我的情况。
答案 4 :(得分:3)
这对我有用:
has_attached_file :avatar, :styles => { :small => "52x52",
:medium => "200x200>", :large=> "300x300", :thumb => "100x100>" },
:default_url => "missing_:style.png"
只需将图片放在您的assets / images文件夹中,名为:missing_large.png,missing_medium.png,missing_small.png和missing_thumb.png
答案 5 :(得分:2)
在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' }
答案 6 :(得分:1)
我最终不得不使用以下内容。
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
我静态编译资产并在生产中出错,这对我有帮助。
答案 7 :(得分:1)
在模型文件中,更改以下行:
has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
删除此:
/images/
为每个样式创建一个文件夹,在本例中为medium和thumb,在assests / images中,并在那里放置一个名为missing.png的图像(或者你想要它拥有的任何名称,只要它与文件名匹配)在模型中)
为我工作。
答案 8 :(得分:0)
我通过使用自定义插值器解决了这个问题。
建议使用
的其他解决方案的问题: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, ...
答案 9 :(得分:0)
只需从/
:/images/pic.png
images/pic.png
即可