问题描述
我有一个关于创建组合照片的问题。 我想创建一个复合图像文件,我需要使用 gemcarrierwave 从 ImageUploader 获取一个值。 一张图片就像背景图片,另一张是用户上传的 png 文件,我需要这个名字。
如果我能得到文件名,但我无法从 ImageUploader 得到文件名,我相信它会起作用。
items_controller.rb
$mockup_image = @plain_product_color.mockup_image
image_uploader.rb
class ImageUploader < CarrierWave::Uploader::Base
//
private
mockup_image = $mockup_image
base_image = MiniMagick::Image.open("#{Rails.root}/public/mockup_images/#{mockup_image}")
我使用这个全局变量“$mockup_image”,这是可行的(当然),但我需要传递一个变量。
请任何人给我一些建议,谢谢。
解决方法
我认为您可以通过 model
传递上传变量,因为 CarrierWave::Uploader::Base
包含 model reference
是挂载到该上传器的 ActiveRecord
实例。
class User
mount_uploader :avatar,AvatarUploader
attr_accessor :background_image
end
class AvatarUploader < CarrierWave::Uploader::Base
process :composite
def composite
manipulate! do |image|
base_image = MiniMagick::Image.open(model.background_image)
image.composite(base_image) do |c|
# ...
end
end
end
end
现在我们可以在控制器上设置 background_image
# controller
def create
user.background_image = # background image path
user = User.new(params) # avatar = params[:file]
if user.save
...
end
然而,如您所见,我们使用 model
来膨胀 ui parameters
,以便更好地封装用户头像 ui 装饰器(背景图像,旋转,模糊,...)到一个对象
class AvatarDecorator
attr_accessor :background_image,:round,:rotate #...
def initialize(options={}) # or you can create a builder pattern
background_image = options[:background_image]
# ...
end
end
class User
mount_uploader :avatar,AvatarUploader
attr_accessor :avatar_decorator
end
class AvatarUploader < CarrierWave::Uploader::Base
process :composite
def composite
set_background if model.avatar_decorator.background_image
# ...
end
def set_background
manipulate! do |image|
# ...
end
end
end
# controller
def create
user.avatar_decorator = AvatarDecorator.new({background_image: "..."})
# ...
end