使用Paperclip gem动态生成Amazon S3资产的文件路径

时间:2016-03-18 18:04:07

标签: ruby-on-rails amazon-s3 paperclip

我成功使用Paperclip gem将文件上传到Amazon S3。我的问题是,如何配置我的模型以根据对象属性更改文件路径?

例如,我希望将2015 RAM 1500的图像上传到" cars / 2015 / RAM / 1500 /:id。"

这是我尝试过的。 ":id /:style_:extension"被正确的信息取代,但其他属性却没有 - 即使每辆车都有一年,制造商和型号。

class Car < ActiveRecord::Base
  has_attached_file :file, default_url: "/images/:style/missing.png"
  validates_attachment_content_type :file, content_type: /\Aimage\/.*\Z/
  has_attached_file :file,
                :storage => :s3,
                :path => "cars/:year/:manufacturer/:model/:id/:style_:extension",
                :s3_credentials => Proc.new{|a| a.instance.s3_credentials }

  belongs_to :manufacturer

  def s3_credentials
    {:bucket => ENV['bucket'], :access_key_id => ENV['access_key_id'], :secret_access_key => ENV['secret_access_key']}
  end
end

2 个答案:

答案 0 :(得分:0)

好的,它在文档(oops)中:Paperclip Interpolations

我为插入汽车模型所需的每个属性添加了此块:

Paperclip.interpolates :year do |attachment, style|
  attachment.instance.year
end

答案 1 :(得分:0)

这是您可以执行的另一种方法,它非常干净且可重复使用。尽管有时会感到担忧,但这是其中非常有用的一种情况!

# lib/interpolates.rb
module Interpolates
  extend ActiveSupport::Concern

  included do
      def self.interpolates(attr)
          Paperclip.interpolates(attr) do |attachment, style|
              attachment.instance.send(attr)
          end
      end
  end
end

然后,在您的任何模型中:

# models/car.rb
class Car < ApplicationRecord
  include Interpolates

  interpolates :manufacturer

  # ...
end

然后,您只需很少的代码就可以在所需的任何模型中使用它!