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に正しいクラスを与えていないため、このエラーが発生します。これは単なる文字列です。
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|
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)
お役に立てれば。
私の問題はルートでgetメソッドを受け入れていなかったため、パッチメソッドとして変更し、正常に動作します。
<%= form_for @product, :url => "/products/#{@product.id}/upload",:method => :patch, :html => { :multipart => true } do |f| %>
私は<input type="file" ... multiple="multiple">
ファイル入力時に、Paperclip添付データは配列にありました。ファイル入力の複数の属性を削除するだけでこれを解決しました。
ビューの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.2.xから4.3.xにアップグレードしたとき、このエラーを解消するには、メインのPaperclipフィールド属性(picture
、image
など)を相対URLから完全なURLに変更する必要がありました。 。
私の場合、@ 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
Paperclip( 'rake db:migrate')をインストールした後、必ずデータベースを移行してください...また、Paperclipによって生成された新しいデータフィールドをモデルの 'attr_accessible'行に追加する必要がある場合があります。私のプロジェクトの1つでPaperclipを使用しようとしたときに、同様の問題が発生しました。
同じ問題に遭遇しました。同じattached_file_name
...を共有する2つのテーブルがあるためだと思います。私の場合、アクティビティとツイートの両方に:photo
列を追加します。システムはそれらの1つを見つけることができますが、もう1つは見つけることができません。ファイルは/public/photo/:id/:id
パスに保存されるため、両方ともphoto
という名前の2つの列がある場合、問題が発生すると思います。
私にとって問題は次のようなものでした:
いくつかの答えで見たように、私はコントローラでそのような行を使用しました:
@image = User.find(params[:id]).image.<b>path</b>(:small)
「ファイルのハンドラがない」という問題がありました
だから、私はちょうど「パス」を削除し、それが機能しました:
@image = User.find(params[:id]).image(:small)