CarrierWaveでURLから画像を取得して、その画像をアップロードしてCarrierWaveで利用する方法をまとめました。


環境
  • Rails 4.1.4
  • CarrierWave 0.10.0

URLから画像を保存するメソッド

例えばUserprofile_imageというアップローダをマウントした場合、remote_profile_image_url=というメソッドが定義されます。

remote_profile_image_url=メソッドで値を代入すると、代入されたURLから画像を取得し、アップローダで処理されます。
S3にアップロードするfogなどを使っている場合は、S3に画像がアップロードされます。

実際に使う場合は以下の様なコードになります。

user.remote_profile_image_url = "https://graph.facebook.com/#{facebook_id}/picture?type=large"

注意したいのは、指定したアドレスが直接profile_image_urlになるのではなく一度取得した上でアップローダにしたがって保存されます。

今回の案件ではFacebookやTwitterのプロフィール画像を使いたいというストーリーで、Twitterなどはプロフィール画像を変えると元の画像にアクセスできなくなるので、一度サービス側で保存しておくことはベストプラクティスだと思います。


ちなみに、Kernel#openとかを使ってURLから画像を取得して代入するメソッドを作ってみたのですが上手く行きませんでした。

def profile_image_url=(image_url)
  self.profile_image = open(image_url)
end

remote_*_urlを使えば解決なので問題ないですが…


ruby on rails – How to assign a remote file to Carrierwave? – Stack Overflow