动态使用:Paperclip中的default_url

dgi*_*rez 11 ruby-on-rails paperclip

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

这是我的第一次采取:

编辑添加完整模型:

class Service < ActiveRecord::Base

  attr_accessible :logo, :logo_file_name, :logo_content_type, :logo_file_size, :logo_updated_at

  belongs_to :category, :counter_cache => 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
Run Code Online (Sandbox Code Playgroud)

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

undefined method `category' for #<Class:0x0000010a731620>
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

EDIT2:

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

解:

请看下面我自己的答案.

dgi*_*rez 22

我找到了一个解决方案,遵循这个要点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
Run Code Online (Sandbox Code Playgroud)

和初始化程序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
Run Code Online (Sandbox Code Playgroud)


new*_*iks 9

回形针维基上现在有一个很好的清洁解决方案:url,:path:default_url,它可以使用奶嘴.

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


bcd*_*bcd 8

您可以将Proc as:default_url传递给paperclip.请参阅https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/attachment.rb#L135.Paperclip将使用Attachment对象作为参数调用该proc.Attachment对象有一个访问者'instance',它是它附加到的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>" }
Run Code Online (Sandbox Code Playgroud)