2012-03-21 74 views
1

我使用附件模型作为多态关联。如何根据关联更改路径和网址参数。回形针自定义路径和多态关联网址

附件模型

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 

项目模型

class Project < ActiveRecord::Base 
... 
has_many :attachments, :as => :attachable, :dependent => :destroy 
end 

客户

class Client < ActiveRecord::Base 
... 
has_many :attachments, :as => :attachable, :dependent => :destroy 
end 

以下路径文件保存罚款。

:path => ":rails_root/public/attachments/:id/:basename.:extension", 

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

/attachments/project/ 
/attachments/client/ 

回答

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 
+0

感谢@artimuz工作正常 – Prasanna 2012-03-21 09:02:36

0
has_attached_file :attachment, :path => ":rails_root/public/attachments/#{lambda { |a| a.instance.images_path? ? 'project' : 'client' }}/:id/:basename.:extension" 



def images_path? 
    if your pretty condition 
     #return true 
    else 
     #return false 
    end 
    end