Carrierwave Cloudinary 集成 Ruby on Rails

Posted

技术标签:

【中文标题】Carrierwave Cloudinary 集成 Ruby on Rails【英文标题】:Carrierwave Cloudinary integration Ruby on Rails 【发布时间】:2018-06-09 22:12:25 【问题描述】:

我正在尝试上传某种个人资料图片,其工作原理如下:用户可以从他的计算机 (carrierwave) 中选择要上传的个人资料图片,然后他可以使用正方形 1:1 的宽高比,就像在 Whatsapp 中一样(我使用 carrierwave-crop-on-fly),最后裁剪后的图片通过 Cloudinary 上传到云端,并绑定到我的模型“用户”的“图像”列.我跟着cloudinary's tutorial做了整合

这是我到目前为止所做的。这是与cloudinary绑定的上传器:

class AvatarUploader < CarrierWave::Uploader::Base

  include Cloudinary::CarrierWave
  include CarrierWave::MiniMagick
  process crop: [100, 100]

  def public_id
    model.nombre
  end
end

在用户模型中:

class User < ActiveRecord::Base
  mount_uploader :image, AvatarUploader
  ...

在我看来,我可以更改个人资料图片:

.well
  .row-fluid
    .span8.offset2
      %p
        .inline-block
          = form_for @user, method: :post, url: change_photo_self_url do |f|
            = f.file_field :image
            .hidden#cropbox= f.cropbox :image, width: 300, height: 300
            = f.submit "Crop", class: "btn btn-success blanco"
            ...

(当file_field改变时出现#cropbox,即检查图像时)

最后,在 users_controller 中

...
    def change_photo
      user = current_user
      user.update_attributes(user_params)
      sign_in(user)
      redirect_to profile_url
    end
    private
      def user_params
        params.require(:user).permit(..., :image)
    end

没有“裁剪”的东西一切都很好。也就是说,我实现了用户可以选择图像并上传它并且一切正常。但是,当我添加用于裁剪的控件时,它会崩溃。当我选择一个图像时,出现了裁剪表面,我可以完美地选择它,但是当我点击提交按钮“裁剪”时,甚至在到达控制器的动作之前就触发了以下错误:

Rack::QueryParser::ParameterTypeError at /change_photo
expected Hash (got Hash) for param `image'

这里是调用的参数:

#<Rack::QueryParser::Params:0x396f9f0 @limit=65536, @size=5, @params="image"=>:filename=>"140.jpg", :type=>"image/jpeg", :name=>"user[image]", :tempfile=>#<Tempfile:C:/Users/josem/AppData/Local/Temp/RackMultipart20171229-7548-15105ol.jpg>, :head=>"Content-Disposition: form-data; name=\"user[image]\"; filename=\"140.jpg\"\r\nContent-Type: image/jpeg\r\n">

我可能猜想两个具有相同名称的参数可能是一个问题,但我不知道如何更改它以使其工作,我不明白为什么“预期哈希(得到哈希)”是一个问题

【问题讨论】:

【参考方案1】:

虽然我对“carrierwave-crop-on-fly”不太熟悉,但您可能需要考虑以不同的方式完成它。 Cloudinary 还提供开箱即用的上传小部件 (https://cloudinary.com/documentation/upload_widget),它还支持执行客户端裁剪。 这是一个基本的 RoR/CarrierWave/Cloudinary's-Upload-widget 示例项目,您可以进行测试:https://github.com/taragano/Carrierwave_widget

此项目目前不包括裁剪功能,但可以轻松添加,请参阅提供的文档页面。 您可以在小部件上设置的参数之一是 cropping_aspect_ratio,它可能对您有所帮助。

另外,请注意,使用小部件,裁剪将在客户端完成,这将有助于加快上传速度,而且您的服务器也不需要处理裁剪。

【讨论】:

以上是关于Carrierwave Cloudinary 集成 Ruby on Rails的主要内容,如果未能解决你的问题,请参考以下文章

CKEditor Carrierwave Cloudinary

Rails carrierwave 和 cloudinary 多文件上传

使用 Cloudinary 和 Carrierwave 进行 RMagick 压缩

需要实现#cache!如果你想使用 Cloudinary::CarrierWave::Storage 作为缓存存储

CarrierWave/Cloudinary 缓存的图像在开发环境中无法跨表单重新显示

使用Cloudinary,Carrierwave,Ckeditor和Rails Admin时出现问题