所以我正在使用rails 3.2 app,我有一个CarrierWave上传器;我用来上传图像,并将它们分成几种不同的尺寸 - 非常标准的东西。
我想要做的是在上传的图像上复合一个新图像,这也非常简单。 (通常用于水印)。不同之处在于,我不需要使用静态值来定位合成图像,而是需要它们是动态的。
我遇到的问题是弄清楚如何将动态用户定义的位置参数传递到'version'块中的载波处理器中。
有什么想法吗?
答案 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
恕我直言,它比使用虚拟实例变量污染模型更好。