gpt4 book ai didi

ruby-on-rails - 如何在载波版本处理中使用模型属性/事件记录方法?

转载 作者:数据小太阳 更新时间:2023-10-29 08:10:30 24 4
gpt4 key购买 nike

这是寻求 this question 答案的另一个问题.

在我的水印处理器中,如果我将水印图像的路径设置为静态水印图像,一切正常。

我有三个模型:Watermark、Gallery 和 Photo。水印 has_many :galleries。图库 belongs_to :watermarkhas_many :photos。照片 belongs_to :gallerymount_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 参数传递给水印处理器?

最佳答案

问题是当图像安装到模型上时,watemark def 内的变量、 uploader 类内的变量未被激活。那就是所做的。我正在使用 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

解决此问题的关键是在将数据保存到数据库中并允许将参数 user_image 用于上传类后重新创建图像(如您在调用 mark_it def 的模型上所见)。

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

如果设置了模型上的 user_name 参数(在数据库上创建),方法 watermark 只会创建带有水印的图像。因此,当数据保存在数据库中时,此参数可供您的 uploader 类使用。

这就是我所做的,而且效果很好!希望对您有所帮助!

关于ruby-on-rails - 如何在载波版本处理中使用模型属性/事件记录方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6446686/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com