我正在尝试创建一个图像上传器,它可以调整图像的大小并保存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"}
答案 0 :(得分:0)
可能存在的一个问题是,当我们要从表单上传文件时,我们需要在表单中添加html:{multipart:true}。 在你的情况下
<%= form_for(@product), html: { multipart: true } do |f| %>
考虑到请求参数,它会获取图像名称而不是图像文件的字符串。
然后我们需要允许image_attributes的图像而不是名称