2012-05-17 16 views
2

所以我正在一个rails 3.2应用程序中,我有一个CarrierWave上传器;我用它来上传图像,并将它们分割成几个不同的尺寸 - 非常标准的东西。如何将任意用户定义的值传递到CarrierWave图像处理器?

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

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

任何想法?

回答

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 
0

挖了这一点得到它。

您可以传递参数这样

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

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

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

13

对于滑轨4的一个小问题:其他用户选项必须允许使用强参数之前文件输入参数要先正确更新并可通过上载器访问。

+0

这是我遇到过的最该死的邪恶错误。幸运的是,第二次遇到它时,我已经提出了你的答案。 – Brandon

+0

刚才也遇到了这个问题。我很惊讶没有更多的选票。任何试图访问上载文件属性后允许这些属性的模型上的虚拟属性的人都会遇到这种情况。 – JWright

+1

非常感谢您的通知!我花了一个多小时试图将裁剪参数传递给Rails 5上的上传器。实际上,我在我的控制器中使用了:params.permit(:file,:crop_x,:crop_y,:crop_w,:crop_h)而不是params .permit(:crop_x,:crop_y,:crop_w,:crop_h,:file)。只要我切换它完美的工作。我没有在其他地方找到这种有用的信息。 – Johnf39

相关问题