动态使用:Paperclip中的default_url

我正在尝试配置Paperclip以根据实例的类别属性提供不同的缺失图像。 对象的每个类别都有自己的缺失图像。

这是我的第一次采取:

编辑添加完整模型:

class Service  true has_attached_file :logo, :path => "/:id-:style-:filename", :url => ":s3_eu_url", :default_url => "/logos/:style/#{self.category.name]}.png", :styles => { :large => "600x400>", :medium => "300x200>", :small => "100x75>", :thumb => "60x42>" } end class Category < ActiveRecord::Base attr_accessible nil has_many :services end 

在我看来, image_tag service.logo.url(:thumb)输出:

 undefined method `category' for # 

有任何想法吗?

EDIT2:

正常工作的default_url是:default_url => "/logos/:style/missing.png",

解:

请看下面我自己的答案。

我发现了一个解决方案,遵循这个要点和stackoverflow中的另一个问题 。

我的工作方案:

 Class Service has_attached_file :logo, :path => "/:id-:style-:filename", :url => ":s3_eu_url", :default_url => :set_default_url_on_category, :styles => { :large => "600x400>", :medium => "300x200>", :small => "100x75>", :thumb => "60x42>" } private def set_default_url_on_category "/logos/:style/#{category.name}.png" end end 

和初始化程序paperclip_default_url_fix.rb

 module Paperclip module Interpolations def self.interpolate(pattern, *args) pattern = args.first.instance.send(pattern) if pattern.kind_of? Symbol all.reverse.inject(pattern.dup) do |result, tag| result.gsub(/:#{tag}/) do |match| send(tag, *args) end end end end end 

回形针维基上有一个很好的干净解决方案:url:path:default_url ,它可以运行奶嘴。

https://github.com/thoughtbot/paperclip/wiki/Interpolations

您可以将Proc as:default_url传递给paperclip。 请参阅https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/attachment.rb#L135 。 Paperclip将使用Attachment对象作为参数调用该proc。 Attachment对象有一个访问者’实例’,它是它所附加的ActiveRecord对象实例。 在你的情况下,你应该:

  has_attached_file :logo, :path => "/:id-:style-:filename", :url => ":s3_eu_url", :default_url => lambda { |attach| "/logos/:style/#{attach.instance.category.name]}.png }, :styles => { :large => "600x400>", :medium => "300x200>", :small => "100x75>", :thumb => "60x42>" } 

你不需要self

 :default_url => "/logos/:style/#{category.name}.png",