回形针自定义路径和用于多态关联的URL

pra*_*oga 1 paperclip ruby-on-rails-3

我使用附件模型作为多态关联.如何根据关联更改路径和url参数.

附件模型

class Attachment < ActiveRecord::Base
  belongs_to :user
  belongs_to :attachable, :polymorphic => true

  has_attached_file :attachment,
                    :url  => "/attachments/:id/:basename.:extension",
                    :path => ":rails_root/public/attachments/:id/:basename.:extension",
                    :default_url => "/attachments/original/no-file.txt"
end
Run Code Online (Sandbox Code Playgroud)

项目模型

class Project < ActiveRecord::Base
 ...
 has_many :attachments, :as => :attachable, :dependent => :destroy
end
Run Code Online (Sandbox Code Playgroud)

客户

class Client < ActiveRecord::Base
 ...
 has_many :attachments, :as => :attachable, :dependent => :destroy
end
Run Code Online (Sandbox Code Playgroud)

以下路径文件保存正常.

:path => ":rails_root/public/attachments/:id/:basename.:extension",
Run Code Online (Sandbox Code Playgroud)

但我需要保存基于关联的文件,为此如何将参数传递给'path'.'attachable_type'定义了哪个关联上传文件所属

/attachments/project/
/attachments/client/
Run Code Online (Sandbox Code Playgroud)

Tho*_*ory 6

您可以使用Paperclip Interpolations.插值允许您调用方法来确定路径的一部分的值.

class Attachment < ActiveRecord::Base
  belongs_to :user
  belongs_to :attachable, :polymorphic => true

  Paperclip.interpolates :attached_to do |attachment, style|
    attachment.instance.attachable.class.to_s.downcase
  end

  has_attached_file :attachment,
                    :url  => "/attachments/:id/:basename.:extension",
                    :path => ":rails_root/public/attachments/:attached_to/:id/:basename.:extension",
                    :default_url => "/attachments/original/no-file.txt"
end
Run Code Online (Sandbox Code Playgroud)