8

モデルで、ペーパークリップを使用してユーザーにアバターを取り付けました。

has_attached_file :avatar, 
    :styles => {square_tiny: '50x50#', square_small: '100x100#', square: '200x200#'}

私はフォームを持っています

<%= form_for(@user_profile, 
        :url => { :controller => :user_profiles, :action => :update_general_info, :id => @user_profile.id }, 
            :html => {  :multipart => true, 
                :class=> "form-horizontal" }) do |f| %>

            <div class="control-group">
              <%= f.label :avatar, :class => "control-label" %>
                <div class="controls">
                    <%= f.file_field :avatar  %>
                </div>
            </div>

....

<% end %>

アップロードは完璧に機能しますが、戻ってユーザーを編集すると、ファイル フィールドに「ファイルが選択されていません」と表示されます。そして、私はそのアバターの存在を検証しているので、ユーザーが詳細を編集するたびに、アバターを再度アップロードする必要があります...

どうすれば回避できますか?

私はそれが役立つと思った:multipart => trueが、そうではなかった.

4

1 に答える 1

6

ページがファイル フィールドに値を設定する良い方法は絶対にありません。これはセキュリティ上の理由からです。

ブラウザーが、ページまたは JS スクリプトがファイル フィールドに値を設定することを許可した場合、悪意のあるページがシステムまたはパスワード ファイルを使用してファイル フィールドの値を事前に設定できるようになります。そして、それは巨大なセキュリティ ホールになります。

その場合に私が行うことは、既に保存されているファイルを、ユーザーがクリックしてダウンロードできるリンクとして表示することです。次に、削除 (ファイルは AJAX 呼び出しで削除され、リンクは新しいファイル入力に置き換えられます) および置換 (リンクはファイル入力に置き換えられます) するための小さな AJAX リンクを提供できます。

最後のオプションは、AJAX を使用してファイルをアップロードすることです。ファイルのアップロードに AJAX を使用する場合は、非表示のフレームに POST して、ファイル入力が選択された値を保持するようにします。どちらの方法でも、ファイル フィールド値の変更はユーザーが開始する必要があることに注意してください。

于 2013-03-28T12:59:24.823 に答える