проблема в том, что к моменту монтирования образа в модель переменные внутри 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 намодель установлена (создана на БД).Поэтому, когда данные сохраняются в БД, этот параметр доступен для вашего класса загрузки, который вы можете использовать по своему усмотрению.
Это то, что я сделал, и это сработало очень хорошо!Я надеюсь, что это может помочь!