1

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

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

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

_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

以下是相关文件:

图片.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
4

1 回答 1

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_uploadhelper 方法。当直接调用此方法时,您需要传递对象名称和属性(就像您使用其他 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 插件都正确包含。

于 2013-08-03T05:58:58.960 回答