我的数据库有Images
表,属于Users
表。我正在使用JS库来裁剪和上传图像,这些图像将裁剪坐标作为参数发送到控制器。 (我使用croppic)
在我的图像控制器中
def crop_upload
uploader = ImageUploader.new
if uploader.store!(params[:img])
@image = Image.new
@image.href = uploader.url
render :json => {
:status => 'success',
:url => uploader.url,
:width => SETTINGS[:images][:full][:width],
:height => SETTINGS[:images][:full][:height]
}
else
render :json => { :status => 'error', :message => "Oops" }
end
end
params
对象还有一堆信息,如x,y坐标和裁剪宽度,需要传递给Carrierwave ImageUploader对象才能正常裁剪,但我无法看到任何方式让他们到那里。
在我的上传器中,根据文档应该具有值的变量model
和file
是空的。我尝试使用实例变量(@image.params = ...
)传递值,但model
变量为空。
答案 0 :(得分:1)
将裁剪信息存储在模型上(如果您不想实际存储数据,请在attr_accessors中存储)。
然后在carrierwave上传器中使用model.crop_x
,其中crop_x
是您的属性,以访问这些值。
我们将此与cloudinary结合使用,实际上并未裁剪原始图像,而是即时提供裁剪版本。但是,如果要裁剪图像服务器端并存储结果,这也可以使用。
示例:
version :cropped do
process :custom_crop
process convert: 'jpg'
end
def custom_crop
{
x: model.public_send("#{crop_field_prefix}_x"),
y: model.public_send("#{crop_field_prefix}_y"),
width: model.public_send("#{crop_field_prefix}_w"),
height: model.public_send("#{crop_field_prefix}_h"),
crop: :crop
}
end
正如您在本示例中所看到的,我们存储裁剪信息的属性是动态的,但在大多数情况下都是过度的,直接调用model.crop_x
就足够了