2012-08-01 12 views
9

私のサイトのユーザーは、モデル用の自分の写真をアップロードしたり、ライブラリから選択したりできます。ユーザーがライブラリから選択すると、ファイル名が文字列としてサーバー{file: {url: 'url.jpg'}}に送信されます。私は、carrierwaveがモデルファイルをアップロードせずにただ更新できる方法を見つけていません。モデルの中にそのパラメータの存在をチェックする条件を記述してから、model.file = File.open('str.jpg')を書くことができます。それはセキュリティの観点から悪いですか?ファイルを "アップロード"するか、ファイル属性を更新するだけで、すでにサーバー上で利用可能なファイルを参照することはできますか?Carrierwave - 文字列からファイルを "アップロード"

ありがとうございます!

答えて

4

あなたのソリューションが動作します使用していますが、名前はFile.basenameで有効であることを確認する必要がありますので、誰かが../../secret_credentials.ymlを渡すことができませんでしたし、場合use_libraryがtrueを返す場合だけ頼みますあなたが望んでいない情報を公開する。また、あらかじめ設定された画像のリストと照らし合わせてチェックするのも良い考えです。

ただし、この場合CarrierWaveをスキップすることで、これをより効率的に行うことができます。

library_imageという名前の新しいフィールドを追加し、誰かがプリセット画像を使用したい場合はlibrary_imageを設定し、自分の写真を使用する場合はlibrary_imageの設定を解除して写真をアップロードします。その後のようなヘルパーメソッドを追加します。CarrierWaveにこれはあなたがhttp://example.com/images/[name]でプリセットの画像を見つけることができると仮定し、あなたがmount_uploaderを使用している

def avatar_url 
    if self.library_image? 
     "http://example.com/images/#{self.library_image}" 
    else 
     self.picture.url 
    end 
end 

pictureを命名。

いつでも画像を表示したい場合は、avatar_urlと呼び出して、プリセットURLまたはアップロードした画像を返す必要があるかどうかを確認します。

あなたの元の質問に基づいてlibrary_imageまたはpictureを更新する方法の例:

if params[:file].is_a?(Hash) 
    model.library_image = params[:file][:url] 
    model.remove_picture = true 
else 
    model.library_image = nil 
    model.picture = params[:file] 
end 
+0

どのように私は、ユーザーが新しい写真をアップロードしていることを検出することができますか?つまり、library_imageをリセットするために書く必要があるコールバック関数の名前は何ですか?ありがとうございました! – CamelCamelCamel

+0

@CamelCamelCamel私は元の答えを例で更新しました。 –

+0

avatar_urlに応じてファイルをプリセットまたはファイルとして返すにはどうすればよいですか? – CamelCamelCamel

3

私は、これらの画像ファイルを保持しているLibraryImagesという別のリソースを作成します。

これらは、has_manyアソシエーションを使用するUserクラスとの関係になります。 2番目の方法は、ユーザーが事前に定義したイメージの代わりに独自のイメージを使用する場合に分離することです。

そのため、自分のイメージを使用することを選択すると、use_libraryというboolean型を追加することをお勧めします。これは問題なくuser.imageにアップロードされます。あなたのビューで、今

のでFile.openを使用してのimage_tag(user.library_image)

関連する問題