誰かがActiveResourceモデル(Rails 3)でCarrierWaveを使用することについて何か洞察を持っていますか?ファイル名のフィールドを持つActiveResourceモデルがあり、ファイルをリモートファイルシステムに保存したいと思います。
私はあまり成功しなかった(またはリモートで正しく何かをしていると確信して)いくつかのことを試したので、すでにgemに含まれているORMモジュールを使用せずにCarrierWaveを正常に実装した人からの提案をいただければ幸いです。
誰かがActiveResourceモデル(Rails 3)でCarrierWaveを使用することについて何か洞察を持っていますか?ファイル名のフィールドを持つActiveResourceモデルがあり、ファイルをリモートファイルシステムに保存したいと思います。
私はあまり成功しなかった(またはリモートで正しく何かをしていると確信して)いくつかのことを試したので、すでにgemに含まれているORMモジュールを使用せずにCarrierWaveを正常に実装した人からの提案をいただければ幸いです。
原作者が引っ越してしまったので遅くなりましたが、この質問は「carrierwave activeresource」で検索するとトップに出てくるので、まだ回答する価値はあると思いました。
議論のために、CarrierWave アップローダとしてマウントされた artist_picture という名前の写真を持つ Artist という名前のモデルがあると仮定しましょう。ActiveRecord では、この画像をファイルに割り当てます。
artist.artist_picture=File.open('ravello.jpg')
アーティストを保存すると、次のようになります。
artist.save!
画像も保存されます。
さて、これに基づいてリソースを作成するとしましょう:
class Artist < ActiveResource::Base
end
その後、アーティストを読み込んだ場合:
artist = Artist.find(1)
それを見て、私はそこにこれを見つけるでしょう:
#<Artist:0x39432039 @attributes={"id"=>1, "name"=>"Ravello", "artist_picture"=>#<ArtistPicture:0x282347249243 @attributes={"url"=>"/uploads/artists/artist_picture/1/ravello.jpg"}, @prefix_options={}, @persisted=false>, @prefix_options={}, @persisted=false>
興味深いことに、artist_picture はそれ自体がモデルであり、必要に応じて宣言して操作することができます。そのまま、必要に応じて URL を使用して画像を取得できます。しかし、代わりに別の写真をアップロードすることについて話しましょう。
サーバー側のArtistモデルにこの小さなコードを追加できます:
def artist_picture_as_base64=(picsource)
tmpfile = Tempfile.new(['artist','.jpg'], Rails.root.join('tmp'), :encoding => 'BINARY')
begin
tmpfile.write(Base64.decode64(picsource.force_encoding("BINARY")))
file = CarrierWave::SanitizedFile.new(tmpfile)
file.content_type = 'image/jpg'
self.artist_picture = file
ensure
tmpfile.close!
end
end
簡単な例を示しているだけです。おそらく元のファイル名も渡す必要があります。とにかく、リソース側では:
class Artist < ActiveResource::Base
def artist_picture=(filename)
self.artist_picture_as_base64=Base64.encode64(File.read(filename))
end
end
この時点で、リソース側では「artist_picture」をファイル名に設定するだけで、リソースが保存されるときにエンコードされて送信されます。サーバー側では、ファイルがデコードされて保存されます。おそらく、文字列をバイナリエンコーディングに強制するだけでbase64エンコーディングをスキップできますが、そうするとうまくいかず、追跡する忍耐力がありません. base64 としてのエンコードが機能します。