2012-03-20 11 views
6

Mam aplikację szyny, która pierwotnie używała Paperclip do przesyłania plików, jednak, jak zauważyłem, że CarrierWave miał prawdopodobnie opcję "stałego przesyłania" nad redisplayami, postanowiłem spróbować .Przewoźnik Nie zapisuję wysyłania po ponownym wyświetleniu formularza

Moim zdaniem mam następujące:

= f.input :attachment 
= f.hidden_field :attachment_cache 

Które poprawnie buforuje plik, jeśli formularz nie zostanie ponownie wyświetlony i walidacji, jednak kiedy korygować błędy sprawdzania poprawności i ponownie, załącznik nie jest przetwarzany.

Started POST "/section/model" for 127.0.0.1 at 2012-03-20 08:51:56 +0000 
    Processing by Client::WishesController#create as HTML 
    Parameters: {"utf8"=>"✓", "authenticity_token"=>"zkdPQBsAnsNzx555rkwZ5+clfnLaXg+NtL+GdFei188=", "model"=>{"title"=>"Sample", "content"=>"Sample content", "contact_name"=>"Mr Sample", "contact_email"=>"[email protected]", "attachment_cache"=>"20120320-0851-42559-1644/SampleAttachment.pdf"}, "commit"=>"Create Wish"} 
    Client Load (0.3ms) SELECT `clients`.* FROM `clients` WHERE `clients`.`id` = 1 LIMIT 1 
    (0.2ms) BEGIN 
    SQL (0.4ms) INSERT INTO `models` (`attachment`, `client_id`, `contact_email`, `contact_name`, `content`, `created_at`, `status`, `title`, `updated_at`, `upload_content_type`, `upload_file_name`, `upload_file_size`, `upload_updated_at`) VALUES (NULL, 1, '[email protected]', 'Mr Sample', 'Sample content', '2012-03-20 08:51:56', 'Unresolved', 'Sample', '2012-03-20 08:51:56', NULL, NULL, NULL, NULL) 

wydaje się być prawidłowo przechodzącej mocowanie przez attachment_cache w params, ale nie jest to zapisując mocowanie gdyż nie posiada params [: model] [: załącznik] polowych.

Nie zawiera żadnych dalszych kroków w sekcji o numerze przewoźnika, aby umożliwić przesyłanie plików za pośrednictwem formularzy redisplay na ekranie CarrierWave GitHub.

+0

Działa jeśli tworzę/aktualizację z masowego przypisywania i ustawić poszczególne zmienne, ale zastanawiałem się, czy istnieje sposób, aby to zrobić bez masowego przypisania? – HaaR

+0

Rozważ [otwarcie biletu] (https://github.com/jnicklas/carrierwave/issues). –

+1

znalazłeś odpowiedź na to? – user749798

Odpowiedz

3

Spróbuj wypełniania wartość avatar_cache tak, że gdy walidacja nie powiedzie się, zostanie on wstępnie wypełnione w formie:

= f.hidden_field :attachment_cache, :value => @model.attachment_cache 

Gdzie @model to nazwa modelu

To wydaje się działać na mnie, gdy ta sama forma jest ponownie ładowana wiele razy (tj. gdy sprawdzanie poprawności nie powiedzie się wiele razy). Myślę, że opuścili to z dokumentacji.

+0

To nie działało dla formularza zagnieżdżonego – Francisco

+0

To nie działało dla mnie (Rails 4.2.5). – fatuhoku

+0

Musisz również dodać nazwę pola do silnego parametru –

0

Przyczyną jest "zmieniony?" sprawdź, kiedy błąd sprawdzania poprawności, przekazujemy buforowany plik w polu # {model} _cache, który nie jest kolumną tabeli bazy danych, więc nie zapisuje obiektu, ponieważ nic nie jest zmieniane z punktu widzenia AR.

zrobiłem hack do tej pracy przez stworzenie metody w modelu, który zawiera plik: „dane” to nazwa kolumna

def data_cache=(text) 
    @changed_attributes.merge!("data" => nil) 
    super 
end 

nadzieję, że to pomaga.

+0

Edytowałem, aby usunąć historię z tej odpowiedzi. Odpowiedzi powinny odpowiedzieć na pytanie i nie zawierać dodatkowych informacji. Zapraszam do zapoznania się z moimi zmianami i witam w StackOverflow! – BradleyDotNET

0

Dla mnie problemem było to, że miałem

accepts_nested_attributes_for :avatars, allow_destroy: true, reject_if: lambda { |avatar| avatar[:file].blank? } 

Więc ja odrzucenia pliku, ponieważ plik nie był tam

Ważne jest, aby pamiętać, że sam plik nie utrzymują , ale tylko pamięć podręczna plików.Dlatego carrierwave docs sugerują:

To może być dobry pomysł, aby pokazać użytkownikowi, że plik został przesłany, w przypadku obrazów, mała miniatur byłby dobrym wskaźnikiem:

1

to trochę starej pytanie, ale pracował dla mnie po dodaniu silnej parametr do sterownika, jak to:

#controller 
def object_params 
    params.require(:object).permit(:attachment, :attachment_cache) 
end 

#view 
<%= f.file_field :attachment %> 
<%= f.hidden_field :attachment_cache %> 
1

to rozwiąże Twój problem 100%

Proszę spojrzeć na

accepts_nested_attributes_for :avatars, allow_destroy: true, 
reject_if: lambda { |avatar| avatar[:avatar].blank? and avatar[:avatar_cache].blank?} 

Tutaj będziemy odrzucać awatar gdy zarówno avatar[:avatar] i avatar[:avatar_cache] są puste

0

Aby dodać do @ Marko za odpowiedź:

Jeśli używasz usługi Active Administrator, ty” Będę musiał dodać buforowany plik do linii permit_params.

permit_params: :title, :file, :file_cache 
Powiązane problemy