Dynamic use of :default_url in Paperclip

前端 未结 4 1379
灰色年华
灰色年华 2020-12-16 17:31

I\'m trying to configure Paperclip to provide different missing images based on the instance\'s category attribute. Every category of the object has its own missing image.

相关标签:
4条回答
  • 2020-12-16 18:06

    You can pass a Proc as :default_url to paperclip. See https://github.com/thoughtbot/paperclip/blob/master/lib/paperclip/attachment.rb#L135. Paperclip will call that proc with the Attachment object as a parameter. The Attachment object has an accessor 'instance' that is the ActiveRecord object instance it's attached to. In your case you should have:

      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>" }
    
    0 讨论(0)
  • 2020-12-16 18:09

    I found a solution, following this gist and this other question in stackoverflow.

    My working solution:

    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
    

    And an initializer 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
    
    0 讨论(0)
  • 2020-12-16 18:09

    There is a nice clean solution on the paperclip wiki now for :url, :path, and :default_url which works a teat.

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

    0 讨论(0)
  • 2020-12-16 18:20

    You don't need self:

    :default_url => "/logos/:style/#{category.name}.png",
    
    0 讨论(0)
提交回复
热议问题