2016-05-09 10 views
0

Paperclip gem(4.3.6)を使用してサードパーティAPIからファイルをストリーミングし、HTTP応答の本文をFaxとして表すActiveRecordモデルの添付ファイルとして使用したいと考えています。StringIOのPaperclipバリデーションが無効

class Fax 
    has_attached_file :fax_document 
    validates_attachment_content_type :fax_document, content_type: { content_type: ["application/pdf", "application/octet-stream"] } 
end 

以下のコードを使用して、APIサーバーからのHTTP応答を取得し、FAXモデルに添付ファイルとして保存しています。 (以下のコードは簡潔にするために若干変更されています)。

#get the HTTP response body 
response = download(url) 

#add the necessary attributes to the StringIO class. This technique is demonstrated in multiple SO posts. 
file = StringIO.new(response) 
file.class.class_eval { attr_accessor :original_filename, :content_type } 
file.original_filename = "fax.pdf" 
file.content_type = 'application/pdf' 

#save the attachment 
fax = Fax.new 
fax.fax_document = file 
fax.save 

response変数は、PDFバイナリオブジェクトの文字列表現のように見えるとfax.saveがCONTENT_TYPEない有効なエラーを発生させるものを含んでいます。 do_not_validate_attachment_file_type :fax_documentを使用して、ファックスモデルのPaperclip検証を明示的に緩和すると、添付ファイルが適切に保存されます。

Paperclipのコンテンツタイプの検証に失敗したと思われるのは、返されるコンテンツが実際には 'application/pdf'であることが分からないからです。

なぜPaperTypeはcontent_typeを無効にしていますか? Paperclipに回答の本文がpdfであることをどのように伝えますか?

答えて

1

あなたのvalidates_attachment_content_typeの定義が間違っていると思います。 :content_typeオプションにはハッシュを渡すべきではなく、single content type or an array of typesにハッシュを渡すべきです。あなたのケースでは

、次はそれを行う必要があります。

validates_attachment_content_type :fax_document, 
     content_type: ["application/pdf", "application/octet-stream"] 
+0

はあなたにボラマをありがとう! – rswolff

関連する問題