2012-04-05 120 views
36

在轨3.2.2使用回形针3.0.1我得到这个错误:回形针例外:回形针:: AdapterRegistry :: NoHandlerError

**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 

使用参数:

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

任何人都知道发生了什么事?

回答

0

确保在安装Paperclip('rake db:migrate')后迁移数据库...此外,您可能需要将由Paperclip生成的新数据字段添加到模型中的'attr_accessible'行。 当我试图让Paperclip在我的一个项目中工作时,我遇到了类似的问题。

+0

不幸的是,这并没有解决这个问题对我来说。同样的问题将attr_accessible:标题,:描述:价格:assets_attributes, – 2012-04-05 20:31:11

26

我刚碰到这个问题。在我的情况下,这是由于跳过标记中的多部分表单声明造成的。

我用formtastic所以我加了这一点,并得到它的工作:

semantic_form_for @picture, :html => {:multipart => true} do |f|

+4

对于未来的Google,如果你使用的form_for并添加字段外的建设者,你必须手动强制的form_for要多,通过':HTML = > {:multipart => true}',如上所示。只需添加':multipart => true'不会像form_tag那样工作 – agmin 2012-10-18 02:27:30

+0

这个答案适合我!我希望提问者会接受这个。这通常是在为模型创建表单时发生的,然后最终为接受文件作为附件的子对象嵌套属性,在我的情况中,这是附带的。 (这里与我的故事为将来的Google) – 2012-11-20 08:04:37

+0

你救了我 – 2014-02-04 07:18:18

0

我遇到了同样的问题,我觉得是因为有两个表共享同一个attached_file_name ......在我的情况是,我在活动和推文上添加了一个:photo列,那么情况似乎是系统可以找到其中一个,但不是其他的。因为这些文件保存在/public/photo/:id/:id路径中,所以如果您有两列都命名为photo,那么我认为会出现问题。

43

此错误是由于您没有给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>>} 

而且你应该有YOUT查看这样的事情(在HAML,非常简单):

= form_for @product, html: { multipart: true } do |f| 
    = f.fields_for :asset do |asset_form| 
    = asset_form.file_field :image 

请记住,你的表格设置成multipart: true

+2

是千万要记得设置多选择一天。 例如:<(%)=的form_for @video,:方法=>:放,:HTML => {:多=>真}做%> – 2013-06-13 15:43:23

+1

在的form_tag的情况下,它应该是'的form_tag路径,:多=> TRUE'不带:html键。 [链接](https://github.com/thoughtbot/paperclip/issues/865) – 2016-01-22 08:26:28

2

我有<input type="file" ... multiple="multiple">文件输入,所以paperclip附件数据是在一个数组中。 我只是通过删除文件输入的多个属性来解决这个问题。

+2

这也是我的问题。我喜欢':multiple => true'的方便,但正如你所说,它将名称设置为'upload [upload] []'。但是,我真的很喜欢多个文件选择的便利性,所以我只是手动设置名称,使其不是具有':name =>'upload [upload]'''的数组。 – 2012-12-13 14:26:37

+0

我用javascript和jquery fileupload一起添加多个;) – Mirko 2013-02-27 12:50:01

+0

哈!差不多三年后,我在另一个项目中遇到了这个问题,和以前一样,这个答案和我的评论解决了我的问题。 – 2015-08-25 21:42:38

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 %> 
4

注意还有一种情况是用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) 

希望这有助于。

+0

'StringIO()'做了诀窍。 – 2015-08-06 17:05:29

0

我的问题是这样的:

我用控制器等线路,在一些答案看到它:

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

,我有这个问题“不处理程序文件”

所以,我只是删除 “路径” 和它的工作:

@image = User.find(params[:id]).image(:small) 
1

我的问题是不是acceptin g在路由中获取方法,所以我将其更改为修补方法,并且工作正常。

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

在我来说,我是路过的字符串,如@ 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 
0

当我们从4.2.x版升级到版本4.3.x,我们有从相对URL主纸夹字段属性(pictureimage等)改变为一个完整的URL,以消除该误差。