2012-12-11 11 views
8

użyłem spinacz do dołączenia awatara na moim użytkownika, w moim modelu:Rails spinacza, forma Edit file_field nieprzypisane

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

Mam formularz

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

Upload działa idealnie, ale Wracam i EDYTUJ mojego użytkownika, pole pliku mówi "nie wybrano pliku". A ponieważ potwierdzam obecność tego awatara, za każdym razem, gdy użytkownik edytuje swoje dane, musi ponownie załadować swój awatar ...

Jak to obejść?

Pomyślałem, że :multipart => true może pomóc, ale tak się nie stało.

+0

Czy rozwiązałeś ten problem? –

Odpowiedz

5

Nie ma żadnego sposobu, aby strona ustawiła wartość w polu pliku, a to ze względów bezpieczeństwa.

Jeśli przeglądarka zezwoliła stronie lub skryptowi JS na ustawienie wartości pola pliku, które pozwoliłoby złośliwej stronie na ustawienie wartości pola pliku w przypadku niektórych plików systemu lub haseł. I to byłaby ogromna luka w zabezpieczeniach.

W takim przypadku używam już zapisanego pliku jako łącza, które użytkownik może kliknąć, aby pobrać. Następnie możesz podać niewiele linków AJAX do usunięcia (plik zostanie usunięty za pomocą wywołania AJAX, a link zastąpiony nowym wprowadzeniem pliku) i zastąpić (łącze zostanie zastąpione wejściem do pliku).

Ostatnią opcją będzie użycie AJAX do przesłania pliku. Jeśli używasz AJAX do przesłania pliku, POST zostanie ukryta w ukrytej ramce, więc dane wejściowe zachowają wybraną wartość. W obu przypadkach należy pamiętać, że każda zmiana wartości pola pliku musi być zainicjowana przez użytkownika.