获取Paperclip :: AdapterRegistry :: NoHandlerError

时间:2014-11-13 02:21:39

标签: ruby-on-rails ruby-on-rails-4 amazon-s3 paperclip

我正在尝试创建一个图像上传器,它可以调整图像的大小并保存3份副本。但是我得到一个No Handler Error。产品和图片是两种不同的模型。

我正在使用Amazon S3。

错误:

Paperclip::AdapterRegistry::NoHandlerError in ProductsController#create

No handler found for "kBOxT7q.jpg"

... 图片具有这些属性

#<Picture id: 1, product_id: 1, url: nil, created_at: "2014-11-12 23:32:06", 
updated_at: "2014-11-12 23:32:06">

...

  raise NoHandlerError.new("No handler found for #{target.inspect}")

产品控制器

  def create
    @product = Product.new(product_params)
    if @product.save
      if params[:images]
        params[:images].each { |image|
          @product.pictures.create(image: image)
        }
      end
      flash[:info] = "Product added"
      redirect_to dashboard_path
    else
      render 'new'
    end
  end
  private

  def product_params
    params.require(:product).permit(..., images_attributes: [:name])
  end

Picture.rb

class Picture < ActiveRecord::Base
  belongs_to :product

  # This method associates the attribute ":avatar" with a file attachment
  has_attached_file :image, styles: {
    thumb: '100x100>',
    square: '200x200#',
    medium: '400x400>'
  }

  validates_attachment :image, content_type: {
    content_type: ["image/jpg", "image/png", "image/jpeg"]
  }
end

产品型号

class Product < ActiveRecord::Base
  has_many :pictures, dependent: :destroy
  accepts_nested_attributes_for :pictures

查看

<%= form_for(@product) do |f| %>
  <div class="control-group">
    <%= f.label :pictures, :class => 'control-label' %>
    <div class="controls">
      <%= file_field_tag "images[]", type: :file, multiple: true %>
    </div>
  </div>
  ...
<% end %>

调试输出

请求

Parameters:
{"utf8"=>"✓",
 "authenticity_token"=>"kPbpAg5dr4nbl9k2qt7hQ+BDPHZEHGPmImuxxYMxXpI=",
 "product"=>{"name"=>"aaah",
 "price"=>"1.00",
 "category"=>"1",
 "quantity"=>"2",
 "shop_id"=>"1"},
 "images"=>["kBOxT7q.jpg",
 "ZBBukdp.jpg"],
 "commit"=>"Add Product"}

1 个答案:

答案 0 :(得分:0)

可能存在的一个问题是,当我们要从表单上传文件时,我们需要在表单中添加html:{multipart:true}。 在你的情况下

  <%= form_for(@product), html: { multipart: true } do |f| %>

考虑到请求参数,它会获取图像名称而不是图像文件的字符串。

然后我们需要允许image_attributes的图像而不是名称