Как использовать атрибуты модели / методы activerecord при обработке версии carrierwave? - PullRequest
3 голосов
/ 23 июня 2011

Это еще один вопрос в поисках ответа на этот вопрос .

В моем процессоре водяных знаков, если я устанавливаю путь изображения водяного знака к статическому изображению водяного знака, все работает просто отлично.

У меня есть три модели: Водяной знак, Галерея и Фото.Водяной знак has_many :galleries.Галерея belongs_to :watermark и has_many :photos.Photo belongs_to :gallery и mount_uploader :image, PhotoUploader.

Вот что я хотел бы сделать в photo_uploader.rb:

  version :large do
    process :watermark
    process :resize_to_limit => [600, 600]
  end

  def watermark
    manipulate! do |img|
      watermark = Magick::Image.read(model.gallery.watermark.image_url).first
      img = img.composite(watermark, Magick::CenterGravity, Magick::OverCompositeOp)
    end
  end

Хотя использование методов / атрибутов модели прекрасно работает в методе store_dir,он не работает в процессоре водяных знаков.Как передать аргумент model.gallery.watermark.image_url в процессор водяных знаков?

1 Ответ

1 голос
/ 13 марта 2012

проблема в том, что к моменту монтирования образа в модель переменные внутри watemark def внутри класса загрузчика не доступны.Вот что сделал.Я использую mongoid для борьбы с mongoDB.Я установил параметр внутри модели, который будет содержать значение, которое я хочу, например.значение the_current_model.gallery.watermark.image_url.Этот параметр будет user_image.

class Asset
  include Mongoid::Document
  mount_uploader :image, AssetUploader

  field :user_image

  attr_accessible :user_image

  after_save :mark_it

  private
  def mark_it
    image.recreate_versions! if user_image.present?
  end

end

Ключом к решению этой проблемы является воссоздание изображения (как вы видите на модели, вызывающей определение mark_it) после сохранения данных в базе данных и разрешенного параметра user_imageчтобы использовать для вас класс загрузчика.

class AssetUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick

  storage :file
  # storage :fog

  after :cache, :unlink_original_cache

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  # Provide a default URL as a default if there hasn't been a file uploaded:
  # def default_url
  #   "/images/fallback/" + [version_name, "default.png"].compact.join('_')
  # end

  process :resize_to_fit => [800, 800]
  process :quality => 80

  version :thumb do
    process :resize_to_fit => [200, 200]
  end

  version :large do
    process :watermark
  end

  def watermark
    if model.user_name.present?
      manipulate! do |img|
        text = Magick::Draw.new 
        text.gravity = Magick::CenterGravity
        text.fill = 'white'    
        text.pointsize = 40 
        text.stroke = 'none' 
        text.annotate(img, 0, 0, 0, 0, "#{model.user_name}") 
        img
      end
    end
  end

  def unlink_original(file)
    File.delete path if version_name.blank?
  end

  def unlink_original_cache(file)
    File.delete if version_name.blank?
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end

  # Override the filename of the uploaded files:
  # Avoid using model.id or version_name here, see uploader/store.rb for details.
  # def filename
  #   "something.jpg" if original_filename
  # end

end

Теперь ключ здесь:

def watermark
        if model.user_name.present?
          manipulate! do |img|
            text = Magick::Draw.new 
            text.gravity = Magick::CenterGravity
            text.fill = 'white'    
            text.pointsize = 40 
            text.stroke = 'none' 
            text.annotate(img, 0, 0, 0, 0, "#{model.user_name}") 
            img
          end
        end
      end

Метод watermark создает только изображение с водяным знаком на нем, если параметр user_name намодель установлена ​​(создана на БД).Поэтому, когда данные сохраняются в БД, этот параметр доступен для вашего класса загрузки, который вы можете использовать по своему усмотрению.

Это то, что я сделал, и это сработало очень хорошо!Я надеюсь, что это может помочь!

...