如何将任意用户定义的值传递到CarrierWave图像处理器?

时间:2012-05-17 06:44:38

标签: ruby-on-rails ruby ruby-on-rails-3.2 carrierwave rmagick

所以我正在使用rails 3.2 app,我有一个CarrierWave上传器;我用来上传图像,并将它们分成几种不同的尺寸 - 非常标准的东西。

我想要做的是在上传的图像上复合一个新图像,这也非常简单。 (通常用于水印)。不同之处在于,我不需要使用静态值来定位合成图像,而是需要它们是动态的。

我遇到的问题是弄清楚如何将动态用户定义的位置参数传递到'version'块中的载波处理器中。

有什么想法吗?

4 个答案:

答案 0 :(得分:13)

rails 4的一个小问题:其他用户选项必须在强文件之前允许文件输入参数首先正确更新并通过上传器访问。

答案 1 :(得分:4)

您可以将值存储到模型实例

然后,在进程方法中通过模型attr获取它

# model class
# define attr_accessor coords
class User < ActiveRecord::Base
  attr_accessor :coords
  mount_uploader :icon, AvatarUploader
end



# controller
# pass the params to @user.coords
def crop_icon
  @user.coords = params[:coords]
  @user.icon = params[:icon]
  @user.save
end



# Uploader
# the model in the function is same as @user in controll,
# and can be invoked inside of process method 
 def crop_area
    manipulate! do |img|
      unless model.coords.nil?
        coords = JSON.parse(model.coords)
        img.crop("#{coords['w']}x#{coords['h']}+#{coords['x']}+#{coords['y']}")
      end
      img = yield(img) if block_given?
      img
    end
  end

答案 2 :(得分:1)

我有类似的问题。我直接调用了Uploaders存储方法,但它仅接受一个参数,即file。我还需要传递一些ID,以将文件存储在特定目录中。这是我最终要做的,并且非常简单:

我定义了Uploader实例变量as和一个用于设置值的类方法

class DocumentUploader < CarrierWave::Uploader::Base
    attr_accessor :cid

    def set_id id
        self.cid = id
    end
    ...
    def your_method
        my_id = self.cid
    end

end

然后在控制器操作中,我这样做了:

uploader = DocumentUploader.new
uploader.set_id(id)
uploader.store!(my_file)

答案 3 :(得分:0)

挖掘出来。

您可以传递这样的参数

process do_stuff: ["foo", "bar"]

def do_stuff(arg_foo, arg_bar)
  arg_foo == "foo" # => true
  arg_bar == "bar" # => true
end

恕我直言,它比使用虚拟实例变量污染模型更好。