回形针exception:Paperclip :: AdapterRegistry :: NoHandlerError

在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 

与参数:

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

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

这个错误是因为你没有给Paperclip一个正确的类而引发的。 这只是一个string。

你应该收到这样的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

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

我正在使用formtastic,所以我添加了这个工作:

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

请注意,在处理值得注意的HTML5canvas时会出现这种情况。 将canvas数据作为DataURIstring获取并将其发送到服务器可能会导致此错误。 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) 

希望这可以帮助。

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

我很确定你的问题是在视图中的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 %> 

我的问题是不接受get方法的路线,所以我改变了它作为补丁方法,它工作正常。

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

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

我遇到了同样的问题,我认为这是因为有两个表共享相同的attached_file_name …在我的情况下,我添加一个:photo列既活动和鸣叫,那么情况似乎是,系统可以find其中之一,但不是其他。 因为这些文件保存在/public/photo/:id/:idpath,如果你有两列都被命名为photo ,那么我认为会出现问题。

对我来说问题是这样的:

我在控制器中使用了这样的行,正如在一些答案中看到的那样:

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

和我有问题“没有文件处理程序”

所以,我刚刚删除“path”,它的工作:

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

在我的情况下,我是通过string,在@ MauricioPasquierJuan的答案,但我没有使用一种forms,所以答案的其余部分不适用。

我找不到任何有关如何以编程方式更新附件的文档 – 可以分配哪些types,以及为什么分配和保存修改后的logging不保存修改后的附件。 这个问题是我发现的最接近的东西。

在处理上传的压缩文件中的文件的函数中,在将提取的文件保存到临时文件之后,这是我的解决scheme:

 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