web-dev-qa-db-ja.com

ペーパークリップの例外: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", 
             ...}

誰が何が起こっているのか知っていますか?

40
Sten Ka Razin

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 Viewでこのようなものを持っているはずです(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|

27
Ken Mazaika

HTML5キャンバスで作業する場合、注目に値する状況があることに注意してください。キャンバスデータをDataURI文字列として取得してサーバーに送信すると、このエラーが発生する可能性があります。 Canvas .toDataURL()は、「data:image/png; base64、iVBORw0KGg ...」のようなものを提供します。これを他の情報とともにサーバーに送信できるため、標準のマルチパートフォームアップロードとは異なります。サーバー側では、これをPaperclip添付フィールドに設定しただけの場合、このエラーが発生します。ファイルまたは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)

お役に立てれば。

5
bjm88

私の問題はルートでgetメソッドを受け入れていなかったため、パッチメソッドとして変更し、正常に動作します。

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

私は<input type="file" ... multiple="multiple">ファイル入力時に、Paperclip添付データは配列にありました。ファイル入力の複数の属性を削除するだけでこれを解決しました。

2
Mirko

ビューの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 %>
1
Julio Marins

4.2.xから4.3.xにアップグレードしたとき、このエラーを解消するには、メインのPaperclipフィールド属性(pictureimageなど)を相対URLから完全なURLに変更する必要がありました。 。

0
Kyle Heironimus

私の場合、@ MauricioPasquierJuanの回答のようにStringを渡していましたが、フォームを使用していなかったため、残りの回答は適用されません。

プログラムで添付ファイルを更新する方法、割り当て可能なタイプ、変更されたレコードを割り当てて保存しても変更された添付ファイルが保存されない理由に関するドキュメントが見つかりませんでした。この質問は私が見つけた最も近いものでした。

アップロードした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
ShadSterling

Paperclip( 'rake db:migrate')をインストールした後、必ずデータベースを移行してください...また、Paperclipによって生成された新しいデータフィールドをモデルの 'attr_accessible'行に追加する必要がある場合があります。私のプロジェクトの1つでPaperclipを使用しようとしたときに、同様の問題が発生しました。

0
Joe Saunders

同じ問題に遭遇しました。同じattached_file_name...を共有する2つのテーブルがあるためだと思います。私の場合、アクティビティとツイートの両方に:photo列を追加します。システムはそれらの1つを見つけることができますが、もう1つは見つけることができません。ファイルは/public/photo/:id/:idパスに保存されるため、両方ともphotoという名前の2つの列がある場合、問題が発生すると思います。

0
Yitong Zhou

私にとって問題は次のようなものでした:

いくつかの答えで見たように、私はコントローラでそのような行を使用しました:

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

「ファイルのハンドラがない」という問題がありました

だから、私はちょうど「パス」を削除し、それが機能しました:

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