2017-03-06 1 views
0

私は、DocumentモデルでCarrierwaveを使用しています。 ホストをCarrierwaveのURLに追加するにはどうすればよいですか?

class Document 
    mount_uploader :file, DocumentUploader 
end 

と、添付ファイルのテストで

class DocumentMailer 
    def distribute(recipient, document) 
    filename = document.file.file.original_filename 
    attachments[ filename ] = File.read(document.file.url) 
    mail( 
     to: receipient.email, 
     subject: "Document attached" 
    ) 
    end 
end 

として文書を電子メールで送信しようとしています、メーラーは、私がテストスイートにこのエラーを解決することができます

Errno::ENOENT: 
     No such file or directory @ rb_sysopen - /uploads/document/file/2/my_attachment.jpg 

エラーを上げていますDocumentMailerでurlの代わりにpathを呼び出して、完全なファイルシステムのパスを返します。

attachments[ filename ] = File.read(document.file.path) 
# /Users/AHH/code/myapp/tmp/uploads/document/file/2/my_attachment.jpg 

ただし、この方法では、製造に失敗します。 Carrierwaveは霧を使ってS3にファイルを保存しているので、DocumentMailerに添付ファイルを割り当てるには完全なURLが必要です。

file.urlを使用すると、テストに失敗するのはなぜですか?私はそれはURLがホストを持たないためだと仮定します。ですから、Carrierwaveがテスト環境でホストをfile.urlに適用する方法を教えてください。

答えて

0

これは、urlが実際には本番環境のURL、おそらくS3ホストにあるという事実のために、開発/テスト対ファイル作成にファイルを格納する方法の副作用ですが、ローカルではファイルへのパスです。アップロードを保存するように指定した場所を基準にしています。残念ながら、CarrierWaveはこれまで少なくとも私が見たように、これを扱う上品な方法を持っているようには見えないので、スペックヘルパーでこのようなことをやりました:

config.before do 
    allow_any_instance_of(DocumentUploader).to receive(:url) do |uploader| 
    uploader.path 
    end 
end 
関連する問題