在rails 3.2.2中使用Paperclip 3.0.1我收到此错误:
**Paperclip::AdapterRegistry::NoHandlerError**
(No handler found for "2009-11-29-133527.jpg"):
在我的模特中,我有:
class Product < ActiveRecord::Base
...
has_many :assets
accepts_nested_attributes_for :assets
end
class Asset < ActiveRecord::Base
belongs_to :product
has_attached_file :image,
:path => ":rails_root/public/system/:attachment/:id/:style/:filename",
:url => "/system/:attachment/:id/:style/:filename",
:styles => { :medium => "300x300>", :thumb => "100x100>" }
end
异常发生在:
def create
**@product = Product.new params[:product]**
...
end
用params:
{...,
"product"=>{"title"=>"wibble1",
**"assets_attributes"=>{"0"=>{"image"=>"2009-11-29-133527.jpg"}
},**
"description"=>"Who is wibble...",
"price"=>"23.45"
},
"commit"=>"Create Product",
...}
任何人都知道发生了什么事?
答案 0 :(得分:45)
引发此错误是因为您没有为Paperclip提供正确的类。这只是一个字符串。
您应该在params
"asset"=>
{"image"=>
#<ActionDispatch::Http::UploadedFile:0x000000056679e8
@content_type="image/jpg",
@headers= "Content-Disposition: form-data; name=\"asset[image]\";
filename=\"2009-11-29-133527.jpg\"\r\nContent-Type: image/jpg\r\n",
@original_filename=""2009-11-29-133527.jpg"",
@tempfile=#<File:/tmp/RackMultipart20120619-1043-yvc9ox>>}
你应该在你的视图中看到类似的东西(在HAML中,非常简化):
= form_for @product, html: { multipart: true } do |f|
= f.fields_for :asset do |asset_form|
= asset_form.file_field :image
请务必将表单设置为multipart: true
。
答案 1 :(得分:27)
我自己也遇到了这个问题。在我的情况下,它是由跳过标记中的多部分表单声明引起的。
我使用的是formtastic,所以我添加了它并使其正常工作:
semantic_form_for @picture, :html => {:multipart => true} do |f|
答案 2 :(得分:5)
请注意,使用值得注意的HTML5画布时会出现这种情况。将画布数据作为DataURI字符串并将其发送到服务器可能会导致此错误。 Canvas .toDataURL()将提供类似“data:image / png; base64,iVBORw0KGg ...”的内容,您可以将其与其他信息一起发送到服务器,因此它与标准的多部分表单上传不同。在服务器端,如果您只是将其设置为回形针附件字段,您将收到此错误。您需要将其转换为文件或IO对象。你可以写一个像这样的临时文件:
data_uri = params[:canvasDataUri]
encoded_image = data_uri.split(",")[1]
decoded_image = Base64.decode64(encoded_image)
File.open("signature.png", "wb") { |f| f.write(decoded_image) }
或使用Ruby的StringIO,其作用类似于内存文件接口
@docHolder.document = StringIO.new(decoded_image)
希望这有帮助。
答案 3 :(得分:2)
我在文件输入上有<input type="file" ... multiple="multiple">
,因此回形针附件数据在数组中。
我只是通过删除文件输入的多个属性来解决这个问题。
答案 4 :(得分:2)
我的问题是不接受路由中的get方法所以我将其更改为补丁方法,并且工作正常。
<%= form_for @product, :url => "/products/#{@product.id}/upload",:method => :patch, :html => { :multipart => true } do |f| %>
答案 5 :(得分:1)
我很确定你的问题在于视图中的form_for, 尝试这样的事情:
<%= form_for @restaurante, :html => { :multipart => true } do |form| %>
Nome:<%= form.text_field :nome%>
Endereço:<%= form.text_field :endereco %>
Especialidade:<%= form.text_field :especialidade %>
Foto:<%= form.file_field :foto %>
<%= form.submit 'create'%>
<% end %>
答案 6 :(得分:0)
确保在安装Paperclip('rake db:migrate')后迁移数据库...此外,您可能需要将Paperclip生成的新数据字段添加到模型中的“attr_accessible”行。 当我试图让Paperclip在我的一个项目上工作时,我遇到了类似的问题。
答案 7 :(得分:0)
我遇到了同样的问题,我认为这是因为有两个表共享相同的attached_file_name
...在我的情况下,我在活动和推文中添加:photo
列,然后案件似乎是系统可以找到其中一个但不能找到另一个。由于文件保存在/public/photo/:id/:id
路径中,如果您有两个列都命名为photo
,那么我认为会出现问题。
答案 8 :(得分:0)
对我来说问题是这样的:
我在控制器中使用了这样的一行,正如在一些答案中看到的那样:
@image = User.find(params[:id]).image.<b>path</b>(:small)
我遇到了问题“没有文件处理程序”
所以,我刚刚删除了“路径”,它起作用了:
@image = User.find(params[:id]).image(:small)
答案 9 :(得分:0)
在我的情况下,我正在传递String,就像在@ MauricioPasquierJuan的回答中一样,但我没有使用表格,所以答案的其余部分不适用。
我找不到任何关于如何以编程方式更新附件的文档 - 可以分配哪些类型,以及为什么分配和保存修改后的记录不会保存修改后的附件。这个问题是我找到的最接近的问题。
在处理上传的zip文件中的文件的函数内部,将提取的文件保存到临时文件后,这是我的解决方案:
record.attachment = File.new( tempfile_path_as_string ) ## probably not the only option
record.attachment.save ## next line doesn't update attachment without this
record.save
答案 10 :(得分:0)
当我们从4.2.x升级到4.3.x时,我们不得不将主回形针字段属性(picture
,image
等)从相对URL更改为完整URL以消除此问题错误。