将值传递到Carrierwave ImageUploader

时间:2015-09-12 19:45:07

标签: ruby-on-rails carrierwave

我的数据库有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对象才能正常裁剪,但我无法看到任何方式让他们到那里。

在我的上传器中,根据文档应该具有值的变量modelfile是空的。我尝试使用实例变量(@image.params = ...)传递值,但model变量为空。

1 个答案:

答案 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就足够了