我在使用papperclip和自定义裁剪方面苦苦挣扎。
我正在使用lambda作为样式和自定义处理器,如下面的代码。
但是当我运行User.new(user_params)
时,a.instance
是User
的一个实例,但是为空,user_params
没有传递任何值,例如width
,{{1} }或top
。
保存后,数据就在那里,但裁剪不起作用,因为看起来paperclip忽略保存前的实例是什么。
left
我可以运行 has_attached_file :image,
styles: lambda {|a| {
croped: {processors: [:cropper],
crop_w:a.instance.width,
crop_x:a.instance.left,
crop_y:a.instance.top}
}
},
default_url: "/images/:style/user.png",
validates_attachment_content_type :image, content_type: /\Aimage\/.*\z/
,但这不是正确的方法,图像会被处理两次。
答案 0 :(得分:1)
我有类似的问题。 Paperclip在分配时处理图像而不是保存,因此分配顺序很重要。如果您在image
之前分配top
,Paperclip会在您将image
分配给用户后立即处理该图片,此时image.instance.top
将为空top
1}}还没有被分配。
因此,您需要确保user_params
在top
之前left
,width
和image
。假设user_params
返回ActionController::Paramters
,您只需更改permit
上的属性顺序,例如
params.require(:user).permit(:top, :left, :width, :image)
如果您不想依赖哈希顺序,也可以从参数中删除image
并将其分别分配给用户实例。