2012-12-11 3 views
8

ho usato graffetta per collegare un avatar sul mio utente, nel mio modello:Rails graffetta, Modifica forma file_field non assegnato

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

Ho una forma

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

L'upload funziona perfettamente, ma Torno indietro e MODIFICA il mio utente, il campo file dice 'nessun file scelto'. E poiché convalido la presenza di quell'avatar, ogni volta che un utente modifica i suoi dettagli, deve caricare di nuovo il suo avatar ...

Come posso aggirare questo?

Ho pensato che il :multipart => true sarebbe stato d'aiuto ma non è così.

+0

Hai risolto questo problema? –

risposta

5

Non c'è assolutamente alcun modo per una pagina di impostare un valore in un campo file, e questo è per motivi di sicurezza.

Se il browser ha consentito a una pagina oa uno script JS di impostare un valore in un campo file che consentirebbe a una pagina malevola di preimpostare il valore del campo del file con un file di sistema o di password. E quello sarebbe un enorme buco di sicurezza.

Quello che faccio in questo caso è che visualizzo il file già salvato come un collegamento che l'utente può fare clic per scaricare. È quindi possibile fornire piccoli collegamenti AJAX da eliminare (il file viene eliminato con una chiamata AJAX e il collegamento sostituito con un nuovo input di file) e sostituire (il collegamento viene sostituito con un input di file).

L'ultima opzione sarebbe utilizzare AJAX per caricare il file. Se si utilizza AJAX per il caricamento di un file, si esegue il POST su una cornice nascosta, in modo che l'input del file mantenga il valore selezionato. In entrambi i casi, tenere presente che qualsiasi modifica al valore del campo file deve essere avviata dall'utente.