9

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

ありがとう!

4

2 に答える 2

4

使用するソリューションはFile.open機能しますが、名前が有効であることを確認して、File.basename誰かが渡し../../secret_credentials.ymlて欲しくない情報を公開できないようにする必要があります。また、プリセット画像のリストと照らし合わせて確認することをお勧めします。

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

と呼ばれる新しいフィールドを追加しlibrary_imageます。誰かがプリセット画像をlibrary_image使用したい場合は を設定し、自分の写真を使用したい場合は、設定を解除library_imageして通常どおり写真をアップロードします。次に、次のようなヘルパー メソッドを追加します。

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

これは、プリセット画像が で見つかり、CarrierWave でhttp://example.com/images/[name]使用していることを前提としています。mount_uploaderpicture

写真を表示したいときはいつでも呼び出し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
于 2012-08-07T22:42:46.987 に答える
3

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

これらは、関連付けを使用して User クラスと関係がありますhas_many。2 つ目は、ユーザーが事前定義されたイメージの代わりに独自のイメージを使用したい場合に分離することです。

そのため、「use_library」と呼ばれるブール型を追加することをお勧めします。独自の画像を使用することを選択すると、問題なく user.image にアップロードされます。

今あなたの見解では、use_libraryがtrueを返すかどうかを尋ねるだけです。image_tag(user.library_image)

于 2012-08-01T15:21:32.857 に答える