2

所以我正在开发一个带有 CarrierWave 上传器的 rails 3.2 应用程序;我用它来上传图像,并将它们分割成几种不同的尺寸——非常标准的东西。

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

我遇到的麻烦是弄清楚如何在“版本”块中将动态用户定义的位置参数传递到我的载波处理器中。

有任何想法吗?

4

4 回答 4

13

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

于 2014-04-15T02:36:58.830 回答
4

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

然后,在 process 方法中通过模型 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
于 2012-09-10T09:55:55.657 回答
1

我有类似的问题。我直接调用了 Uploaders store 方法,但它只接受一个参数,即文件。我还需要传递一些 id 来将文件存储在特定目录中。这就是我最终做的事情,而且相当简单:

我将上传器实例变量定义为和一个类方法来设置值

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)
于 2018-10-08T09:47:05.493 回答
0

挖这个。

你可以像这样传递参数

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

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

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

于 2014-01-21T19:36:36.413 回答