使用Cloudinary和Carrierwave直接上传

时间:2013-08-03 00:15:09

标签: ruby-on-rails carrierwave cloudinary

我一直在按照Cloudinary提供的说明操作,但无法直接上传。为了进一步复杂化,我的图像上传是一个多态类,通常是嵌套的形式。

我正在使用Cloudinary和Carrierwave宝石。在非直接设置中,一切正常,但是如果一次上传的图像太多(可能经常出现这种情况),独角兽就会超时(

以下是添加文件上传的部分内容。它嵌套在多种不同的表单中,用户可以动态添加和删除字段。根据说明,我尝试将= f.file_field :asset= f.hidden_field :asset_cache替换为= cl_image_upload :asset,但是,这会引发错误:wrong number of arguments (1 for 2..3)。添加第二个参数时,它会附加到生成的HTML中的data-cloudinary-field。此外,添加图像时没有上传,也没有附加到记录的引用。

_image_fields.html.haml

.image-field-group
  .field
    = f.label :asset, "Image"
    = cl_image_upload :asset
    / = f.file_field :asset
    / = f.hidden_field :asset_cache

  - if f.object && f.object.asset && f.object.asset.filename
    .image-box
      = cl_image_tag(f.object.asset.filename.to_s, :transformation => 'hint', alt: f.object.asset.filename.to_s)

  .remove-fields
    = link_to_remove_fields f

以下是相关文件:

image.rb

class Image < ActiveRecord::Base
  default_scope order('images.id ASC')

  attr_accessible               :asset,
                                :asset_cache

  belongs_to                    :imageable, polymorphic: true

  mount_uploader                :asset, ImageUploader
end

image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  include Cloudinary::CarrierWave

  def extension_white_list
    %w(jpg jpeg gif png)
  end
end

编辑:添加了图像控制器

images_controller.rb

class ImagesController < ApplicationController
  before_filter :load_imageable

  def index
    @images = @imageable.images
  end

  def new
    @image = @imageable.images.new
  end

  def create
    @image = @imageable.images.new(params[:image])
    if @image.save
      redirect_to @imageable, notice: "Image created."
    else
      render :new
    end
  end

private

  def load_imageable
    resource, id = request.path.split('/')[1, 2]
    @imageable = resource.singularize.classify.constantize.find(id)
  end
end

1 个答案:

答案 0 :(得分:1)

以下文档部分介绍了如何在Ruby on Rails应用程序中使用浏览器中的直接图像上载。确保以正确的顺序包含jQuery和所需的插件,并添加所需的Javascript配置。

http://cloudinary.com/documentation/rails_image_upload#direct_uploading_from_the_browser

使用接受输入字段名称的cl_image_upload_tag辅助方法,嵌入执行直接图像上传的文件输入字段。

使用CarrierWave时,您可以使用cl_image_upload辅助方法。直接调用此方法时,需要传递对象名称和属性(与其他Rails视图辅助方法一样,例如text_field_tagtext_field)。或者,您可以将它与Rails的标准表单构建器一起使用。 假设您的模型名为entity并且您的CarrierWaver上载程序的属性名为asset,则以下视图代码应嵌入已签名的文件输入字段,以便从浏览器直接上传:

= form_for(:entity) do |f|
  = f.cl_image_upload(:asset)

此外,如下所示,您可以使用present?检查资产是否存在,并将CarrierWave属性直接传递给cl_image_tag。或者,您可以使用CarrierWave标准版本,而不是使用cl_image_tag动态构建图片网址。

- if f.object && f.object.asset.present?
  .image-box
    = cl_image_tag(f.object.asset, :transformation => 'hint', alt: f.object.asset.filename.to_s)

如果文件输入字段已成功添加到您的视图但未执行直接上传,则应验证控制台中是否存在Javascript错误,并且所有jQuery插件都已正确包含。<​​/ p>