通常の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
エラーもありません。私はウェブを見回していて、解決策を見つけることができませんでした。
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
を要求する必要はありません。
実際には、アクティブレコード/モデルヘルパーを使用している場合は、組み込みのremote_{attribute}_url
プロパティを使用してこれを行うことができます(詳細については、CarrierWave railscastを参照してください)。ただし、これが実際にどのように機能するかを確認するためにソースコードを少し掘り下げました。そうでない場合でも、次を使用できるはずです。
uploader = ImageUploader.new
uploader.download! some_remote_url
uploader.store!
試してみる。