4

誰かがActiveResourceモデル(Rails 3)でCarrierWaveを使用することについて何か洞察を持っていますか?ファイル名のフィールドを持つActiveResourceモデルがあり、ファイルをリモートファイルシステムに保存したいと思います。

私はあまり成功しなかった(またはリモートで正しく何かをしていると確信して)いくつかのことを試したので、すでにgemに含まれているORMモジュールを使用せずにCarrierWaveを正常に実装した人からの提案をいただければ幸いです。

4

1 に答える 1

9

原作者が引っ越してしまったので遅くなりましたが、この質問は「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 としてのエンコードが機能します。

于 2012-02-28T21:23:48.290 に答える