1 つのイメージを 2 つの異なる場所にアップロードできるようにしたいと考えています。1 つの場所は (サーバーの) ローカル ファイルシステム上にあり、もう 1 つは Amazon S3 です (Amazon S3 の場所はオプションです)。
私の現在の環境はRails 3.2.8、Ruby 1.9.3で、ファイルのアップロードにはCarrierwaveが使用されています。
次の方法を使用して、いくつかの成功を収めました。
モデル
class Image < ActiveRecord:Base
attt_accessor :remote
before_save :configure_for_remote
mount_uploader :image, ImageUploader #stores images locally
mount_uploader :image_remote, ImageRemoteUploader #store images on S3
def configure_for_remote
if self.remote=="1"
self.image_remote = self.image.dup
end
end
end
関連するビュー フォーム フィールド (単純なフォーム構文)
<p><%= f.input :image, as: :file %></p>
<p><%= f.input :remote, as: :boolean %></p>
ユーザーはフォームの「リモート」チェックボックスをオンにして、アップロードする画像を選択します。before_save コールバックは画像の複製を image_remote に保存し、ファイルはそれぞれのアップローダーによって処理され、目的の結果が得られます。
ただし、そのフィールドを更新したいときに問題が発生し始めています。たとえば、ユーザーが最初に S3 ではなくローカルでファイルをアップロードすることを選択した場合 (リモート チェックボックスをチェックしない)、後でフォームに戻ってリモート チェックボックスをチェックします。この場合、実際のアクティブ レコード列は変更されていないため (リモート フラグのみ)、 before_save コールバックは実行されません。before_validation を使用しようとしましたが、これは機能しません (image_remote アップローダーは適切なファイル名を image_remote 列に保存しますが、画像は S3 にアップロードされません)。明らかに、before_validation と before_save の間で何かが変更されています (画像属性がアップローダーに変換されていますか?) が、これが機能しない理由がわかりません。
以上のことを踏まえると、使用に関する私のアプローチdup
は少しハックだと思います。目標を達成するためのよりエレガントな方法で誰かがアドバイスしてくれることを願っています。
ご協力いただきありがとうございます。