Rails Paperclip полиморфные стили - PullRequest
5 голосов
/ 19 августа 2010

Я использую скрепку для вложений для нескольких моделей, используя accepts_nested_attributes_for.Можно ли указать конкретные параметры стиля скрепки для каждой модели?

Ответы [ 2 ]

10 голосов
/ 19 августа 2010

Да.Я использую наследование отдельных таблиц (STI) на сайтах для обработки аудио, видео и изображений через модель активов.

# models/Asset.rb
class Asset < ActiveRecord::Base
  # Asset has to exist as a model in order to provide inheritance
  # It can't just be a table in the db like in HABTM. 
end

# models/Audio.rb
class Audio < Asset # !note inheritance from Asset rather than AR!
  # I only ever need the original file
  has_attached_file :file
end

# models/Video.rb
class Video < Asset
  has_attached_file :file, 
    :styles => {
      :thumbnail => '180x180',
      :ipod => ['320x480', :mp4]
      },
    :processors => "video_thumbnail"
end

# models/Image.rb
class Image < Asset
  has_attached_file :file,
    :styles => {
      :medium => "300x300>", 
      :small => "150x150>",
      :thumb => "40x40>",
      :bigthumb => "60x60>"
    }
end

Все они входят в Rails как :file, но контроллер (A / V /Я) знает, чтобы сохранить для правильной модели.Просто помните, что все атрибуты для любых форм мультимедиа должны быть включены в Asset: если для видео не нужны заголовки, а для изображений нужны, атрибут caption будет равен нулю для Video.Не будет жаловаться.

Ассоциации также будут работать нормально, если подключены к моделям STI.User has_many :videos будет работать так же, как вы используете его сейчас, просто убедитесь, что вы не пытаетесь сохранить его непосредственно в Asset.

  # controllers/images_controller.rb
  def create
    # params[:image][:file] ~= Image has_attached_file :file
    @upload = current_user.images.build(params[:image]) 
    # ...
  end

Наконец, поскольку у вас есть модель активов, вы все равно можетечитать непосредственно из него, если, например, вы хотите список 20 самых последних активов.Кроме того, этот пример не ограничивается разделением типов мультимедиа, его также можно использовать для разных типов одного и того же: Avatar

2 голосов
/ 24 октября 2012

Значительно приятнее способ может быть, (если использование имеет дело с изображениями):

class Image < ActiveRecord::Base
  belongs_to :imageable, :polymorphic => true
  has_attached_file :attachment, styles: lambda {
    |attachment| { 
      thumb: ( 
        attachment.instance.imageable_type.eql?("Product") ? ["300>", 'jpg'] :  ["200>", 'jpg']   
      ),
      medium: ( 
       ["500>", 'jpg']
      )
    }
  }
end
...