Rails Paperclip'类方法'和验证重构?

时间:2010-09-17 08:47:15

标签: ruby-on-rails activerecord refactoring paperclip

在使用Paperclip构建的用于媒体存储的项目中,我一直在打破DRY原则。我使用以下代码为某些模型添加了资源,例如AlbumPhotoFile,AlbumSoundFile等:

# Asset is a regular < ActiveRecord::Base class 
class AlbumPhotoFile < Asset
  has_attached_file :pic, :url => "foo", :path => "bar"
  validates_attachment_presence :pic, :message => "can't be blank"
  validates_attachment_content_type :pic, :content_type => ["foo", "bar"]
end

扩展到更多要求,我不得不将照片附加到其他模型,比如CityPhotoFile。我想保持验证和has_attached_file fu与其他PhotoFile类型模型相同。我刚刚将PhotoFile模型中的代码复制粘贴到另一个模型,是否有更好的方法?

没有任何与Paperclip相关的错误,存储和显示工作正常,我只是想知道这种类型的操作是否可以放在模块或类似的东西中,为了DRY的缘故。

刚刚反弹代码实在太难看了。如果我没有在这个空间中明确表达我的意图,我可以提供更多细节: - )。

提前谢谢!

2 个答案:

答案 0 :(得分:2)

根据Mr.Matt的解决方案,这对我有用:

# in lib/paperclip_template_audio.rb, for instance
module PaperclipTemplateAudio

  # Stuff directives into including module
  def self.included(recipient)
    recipient.class_eval do
      has_attached_file :pic, :url => "foo", :path => "bar"
      validates_attachment_presence :pic, :message => "can't be blank"
      validates_attachment_content_type :pic, :content_type => ["foo", "bar"]
    end
  end

end # Module

在我的模特中:

class AlbumPhotoFile < ActiveRecord::Base
  include PaperclipTemplateAudio
end

答案 1 :(得分:1)

是的,您可以将该代码移出到模块中,然后将其包含在您的课程中,如下所示:

# in lib/default_paperclip
module DefaultPaperclip
  has_attached_file :pic, :url => "foo", :path => "bar"
  validates_attachment_presence :pic, :message => "can't be blank"
  validates_attachment_content_type :pic, :content_type => ["foo", "bar"]
end


# your active record
class AlbumPhotoFile < ActiveRecord::Base
  include DefaultPaperclip
end

认为应该有效。虽然没经过测试!