Ruby on rails 回形针异常:回形针::AdapterRegistry::NoHandlerError

Ruby on rails 回形针异常:回形针::AdapterRegistry::NoHandlerError,ruby-on-rails,paperclip,Ruby On Rails,Paperclip,使用rails 3.2.2中的回形针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 :asset

使用rails 3.2.2中的回形针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
使用参数:

{...,
 "product"=>{"title"=>"wibble1", 
             **"assets_attributes"=>{"0"=>{"image"=>"2009-11-29-133527.jpg"}
                                  },** 
             "description"=>"Who is wibble...", 
             "price"=>"23.45"
            }, 
             "commit"=>"Create Product", 
             ...}

有人知道发生了什么吗?

确保在安装曲别针(“rake db:migrate”)后迁移数据库。。。此外,您可能需要将曲别针生成的新数据字段添加到模型中的“attr_accessible”行中。
在我的一个项目中尝试使用回形针时,我遇到了类似的问题。

我自己也遇到了这个问题。在我的例子中,这是由于跳过标记中的多部分表单声明造成的

我使用的是formtastic,因此我添加了以下内容并使其正常工作:


semantic\u form\u for@picture,:html=>{:multipart=>true}do | f |
我遇到了同样的问题,我认为这是因为有两个表共享相同的
附加文件名
。。。在我的例子中,我在活动和tweet中都添加了一个
:photo
列,然后系统似乎可以找到其中一个,但找不到另一个。因为文件保存在
/public/photo/:id/:id
路径中,如果您有两列都命名为
photo
,那么我想问题就出现了。

此错误是因为您没有为曲别针提供正确的类。这只是一根线

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>>}
请记住将表单设置为
multipart:true

我在文件输入中有
,因此回形针附件数据是一个数组。
我只需删除文件输入中的多个属性即可解决此问题。

我很确定您的问题在于视图中的表单_, 试着这样做:

<%= 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 %>
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) }
{:multipart=>true}do| form |%>
诺姆:
恩德雷索:
特别是:
福托:

注意,在使用HTML5画布时,有一种情况值得注意。获取画布数据作为DataURI字符串并将其发送到服务器可能会导致此错误。Canvas.toDataURL()将提供类似“data:image/png;base64,iVBORw0KGg…”的内容,您可以将其与其他信息一起发送到服务器,因此它不同于标准的多部分表单上载。在服务器端,如果您只是将其设置为“回形针附件”字段,则会出现此错误。您需要将其转换为文件或IO对象。您可以这样编写临时文件:

<%= 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 %>
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)

希望这有帮助。

对我来说,问题是这样的:

<%= 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 %>
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) }
我在控制器中使用了这样的线路,正如在一些答案中看到的:

@image = User.find(params[:id]).image.<b>path</b>(:small)

我的问题是不接受路由中的get方法,所以我将其更改为patch方法,并且工作正常

<%= form_for @product, :url => "/products/#{@product.id}/upload",:method => :patch, :html => { :multipart => true } do |f| %>
“/products/{@product.id}/upload”,:method=>:patch,:html=>{:multipart=>true}do | f |%>

在我的例子中,我传递字符串,就像@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

当我们从4.2.x升级到4.3.x时,我们不得不将主回形针字段属性(
picture
image
,等等)从相对URL更改为完整URL以消除此错误。

不幸的是,这并不能解决我的问题。添加attr\u accessible:title、:description、:price、:assets\u属性也有同样的问题,对于未来的Google用户,如果您使用表单并在构建器之外添加字段,则必须手动强制表单为多部分,通过
:html=>{:multipart=>true}
如上所示。简单地添加
:multipart=>true
与表单不一样。这个答案对我很有用!我希望询问者会接受这个。通常情况下,当您为模型创建表单,然后最终为接受文件作为附件的子对象创建嵌套属性时,就会出现这种情况,在我的例子中,就是这种情况。(为未来的谷歌人讲述我的故事)这也是我的问题。我喜欢
:multiple=>true
的便利性,但正如您所说,它将名称设置为
upload[upload][]
。但是,我非常喜欢多文件选择的便利性,所以我只是手动将名称设置为不是带有
:name=>“upload[upload]”的数组。
。我使用javascript和jquery fileupload一起添加了多个文件;)哈!差不多三年后,我在另一个项目上遇到了这个问题,和以前一样,这个答案和我的评论解决了我的问题。例如:put,:html=>{:multipart=>true}do%>在form_标记的情况下,它应该是
form_标记路径,:multipart=>true
不带:html键。如果我从资源中选择图像,该怎么办。@Imran您是如何选择它的?这听起来真的是一个不同的问题