所以我正在开发一个带有 CarrierWave 上传器的 rails 3.2 应用程序;我用它来上传图像,并将它们分割成几种不同的尺寸——非常标准的东西。
我想做的是在上传的图像上合成一张新图像,这也很简单。(通常用于水印)。不同之处在于,我不需要使用静态值来定位合成图像,而是需要它们是动态的。
我遇到的麻烦是弄清楚如何在“版本”块中将动态用户定义的位置参数传递到我的载波处理器中。
有任何想法吗?
所以我正在开发一个带有 CarrierWave 上传器的 rails 3.2 应用程序;我用它来上传图像,并将它们分割成几种不同的尺寸——非常标准的东西。
我想做的是在上传的图像上合成一张新图像,这也很简单。(通常用于水印)。不同之处在于,我不需要使用静态值来定位合成图像,而是需要它们是动态的。
我遇到的麻烦是弄清楚如何在“版本”块中将动态用户定义的位置参数传递到我的载波处理器中。
有任何想法吗?
rails 4 的一个小问题:在文件输入参数首先正确更新并通过 Uploader 访问之前,必须在强参数中允许其他用户选项。
您可以将值存储到模型实例中
然后,在 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
我有类似的问题。我直接调用了 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)
挖这个。
你可以像这样传递参数
process do_stuff: ["foo", "bar"]
def do_stuff(arg_foo, arg_bar)
arg_foo == "foo" # => true
arg_bar == "bar" # => true
end
恕我直言,这比使用虚拟实例变量污染模型要好。