在使用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的缘故。
刚刚反弹代码实在太难看了。如果我没有在这个空间中明确表达我的意图,我可以提供更多细节: - )。
提前谢谢!
答案 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
认为应该有效。虽然没经过测试!