Paperclip Broke中的Default_url与资产管道升级

时间:2012-03-10 12:49:46

标签: ruby-on-rails-3 paperclip asset-pipeline

我正在使用Paperclip并为我的某个附件设置了一个default_url选项:

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

自从目录移动后,资产管道显然不喜欢这样。处理这个问题的最佳方法是什么?我对这张照片有两种风格(迷你和拇指)。

10 个答案:

答案 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即可