Rails Paperclip 'методы класса' и рефакторинг валидаций? - PullRequest
0 голосов
/ 17 сентября 2010

Я немного нарушил принцип СУХОГО в проекте, построенном с использованием Paperclip для хранения носителей.Я добавил ресурсы к некоторым моделям, таким как 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 ]

2 голосов
/ 20 сентября 2010

Вот что сработало для меня на основе решения мистера Матта:

# 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 голос
/ 17 сентября 2010

Да, вы можете переместить этот код в модуль, а затем включить его в свой класс следующим образом:

# 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

Думаю, это должно сработать. Не проверено, хотя!

...