微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何将变量传递给carrierwave?

如何解决我如何将变量传递给carrierwave?

我有一个关于创建组合照片的问题。 我想创建一个复合图像文件,我需要使用 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。