web-dev-qa-db-ja.com

CarrierWave指定されたURLにファイルを保存する方法

通常のORMセットアップとフォーム経由のアップロードでCarrierWaveが正常に機能しています。フォーム送信コンテキストの外でCarrierWaveを使用する方法を理解したいと思います。たとえば、ユーザーが登録するときに、Gravatarを取得してCarrierWaveに保存したいと思います。これが私が持っているものです、そしてそれは機能しません:

gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"

uploader = ImageUploader.new
uploader.store! gravatar_url

エラーもありません。私はウェブを見回していて、解決策を見つけることができませんでした。

20
Marc

store!をローカルファイルパスで機能させる方法を理解しようとすると、多くの問題が発生しました。 store!は、実際には文字列ではなくファイルをパラメータとして受け取ることがわかりました。

URLについては、最初にrequire 'open-uri'してから、ファイル/ URLを開く必要があります。このようなものが機能するはずです:

require 'open-uri'
gravatar_url = "http://www.gravatar.com/avatar/#{Digest::MD5.new.update(current_user.email)}?s=512&d=identicon"
tempfile = open(gravatar_url)    

uploader = ImageUploader.new
uploader.store! tempfile

同じことがファイルパスでも機能しますが、その場合はopen-uriを要求する必要はありません。

17
keithepley

実際には、アクティブレコード/モデルヘルパーを使用している場合は、組み込みのremote_{attribute}_urlプロパティを使用してこれを行うことができます(詳細については、CarrierWave railscastを参照してください)。ただし、これが実際にどのように機能するかを確認するためにソースコードを少し掘り下げました。そうでない場合でも、次を使用できるはずです。

uploader = ImageUploader.new
uploader.download! some_remote_url
uploader.store!

試してみる。

19
Chris Nicola