2012-12-11 9 views
8

habe ich Büroklammer einen Avatar auf meinem Benutzer, in mein Modell zu befestigen:Rails Büroklammer, Edit Form file_field nicht zugewiesen

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

ich eine Form haben

<%= 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 %> 

Der Upload perfekt funktioniert, aber Ich komme zurück und bearbeite meinen Benutzer, das Dateifeld sagt 'keine Datei ausgewählt'. Und da ich die Anwesenheit dieses Avatars bestätige, muss er jedes Mal, wenn ein Benutzer seine Daten bearbeitet, seinen Avatar erneut hochladen ...

Wie kann ich das umgehen?

Ich dachte, die :multipart => true würde helfen, aber es tat es nicht.

+0

Haben Sie dieses Problem gelöst? –

Antwort

5

Es gibt absolut keinen guten Weg für eine Seite, einen Wert für ein Dateifeld zu setzen, und zwar aus Sicherheitsgründen.

Wenn der Browser einer Seite oder einem JS-Skript erlaubt, einen Wert auf ein Dateifeld zu setzen, der es einer böswilligen Seite erlauben würde, den Wert des Dateifeldes mit einer System- oder Passwortdatei vorzuspeichern. Und das wäre ein massives Sicherheitsloch.

In diesem Fall zeige ich die bereits gespeicherte Datei als Link an, auf den der Benutzer klicken kann, um ihn herunterzuladen. Sie können dann kleine AJAX-Links zum Löschen bereitstellen (die Datei wird mit einem AJAX-Aufruf gelöscht und der Link durch eine neue Dateieingabe ersetzt) ​​und ersetzen (der Link wird durch eine Dateieingabe ersetzt).

Ihre letzte Option wäre, AJAX zu verwenden, um die Datei hochzuladen. Wenn Sie AJAX für einen Datei-Upload verwenden, werden Sie an einen versteckten Rahmen POST, damit die Dateieingabe den ausgewählten Wert behält. In jedem Fall ist zu beachten, dass Änderungen am Dateifeldwert vom Benutzer initiiert werden müssen.