2010-02-13 9 views
19

Używam spinacza w app szyn i mają następujące trzy walidacji w moim modeluSmarter validations spinacza

validates_attachment_presence :photo      
validates_attachment_size :photo, :less_than=>1.megabyte 
validates_attachment_content_type :photo, :content_type=>['image/jpeg', 'image/png', 'image/gif'] 

Jeśli użytkownik zapomni dodać załącznik, wszystkie trzy validations zawieść, a tym samym, użytkownik przedstawiane z trzech następujących błędów:

# Photo file name must be set. 
# Photo file size file size must be between 0 and 1048576 bytes. 
# Photo content type is not included in the list 

myślę, że najlepiej byłoby, aby po prostu pokazać pierwszy błąd w tym przypadku, ponieważ pozostałe dwa błędy są czysto wtórne ... wolałbym użytkownikowi tylko kiedykolwiek zobaczyć drugie dwa błędy, jeśli załącznik został dodany, ale nie spełnia kryteriów walidacji.

Jestem pewien, że nie ma wstępnie upieczonego sprawdzania poprawności, które robi tego rodzaju rzeczy i od czytania kodu w dostawcy/plugins/paperclip/lib/paperclip.rb Widzę, że metoda validates_attachment_size obsługuje: chyba parametr jako pokazano:

def validates_attachment_presence name, options = {} 
    message = options[:message] || "must be set." 
    validates_presence_of :"#{name}_file_name", 
         :message => message, 
         :if  => options[:if], 
         :unless => options[:unless] 
end 

Tak, myślałem, że mogę zrobić coś jak następuje:

validates_attachment_size :photo, :less_than=>1.megabyte, :unless=> :photo.blank 

Ale to przerywa aplikację. Ktoś ma jakieś doświadczenie w robieniu tego typu rzeczy? Byłby to miły wkład do kodu źródłowego spinacza.

EDIT:

Próbowałem przy użyciu to:

validates_attachment_size :photo, :less_than=>1.megabyte, 
    :unless=> Proc.new { |image| image[:photo].nil? } 

To nie dość pracy choć jak mam tylko udało się załadować mp3 5MB z tej weryfikacji na miejscu. Ale to obiecujące, ponieważ komunikat o błędzie nie pojawia się, gdy użytkownik nie dołączył zdjęcia.

+0

Która wersja spinacz używasz? Mam 2.3.1.1 i to, co opisujesz, dzieje się automatycznie dla mnie. Jeśli żaden plik nie jest dołączony, zwraca tylko ten błąd. Jeśli dołączę plik, ale sprawdzanie poprawności rozmiaru i typu zawartości zakończy się niepowodzeniem, zostaną wyświetlone te błędy. –

+0

Dziwne, ponieważ jestem też w wersji 2.3.1.1 wtyczki ... mam zamiar zastosować się do poniższej sugestii na temat tworzenia własnych niestandardowych komunikatów o błędach, ponieważ tak naprawdę nie podoba mi się sposób, w jaki mówią o potrzebach attacment być między 0 a X bajtów .... – stephenmurdoch

+0

Używam 2.3.2 z tym samym problemem –

Odpowiedz

29
validates_attachment_size :photo, :less_than => 1.megabyte, 
    :unless => Proc.new { |imports| imports.photo_file_name.blank? } 
+0

to jest idealne - dzięki. – stephenmurdoch

+1

Lepsze niż to:: if => Proc.new {| import | ! imports.photo.file? } –

+0

Nie wiem, w jakiej wersji została udzielona ta odpowiedź, ale nie działa ona w moim systemie lokalnym (z uruchomieniem Paperclip 2.3.11 na Rails 3.1.3). – pcg79

5

Myślę, że możesz to zrobić w inny sposób. Nie zadzieraj z weryfikacjami. Prawdopodobnie masz coś takiego w swojej formie:

<%= f.error_messages %> 

Możesz usunąć i napisać własnego pomocnika, aby wyświetlić komunikaty o błędach. Błędy są przechowywane w hash:

@photo.errors 

Albo jeśli chcesz dostać się do nich za pośrednictwem formularza Konstruktor:

f.object.errors 
+0

Ładne podejście, sprytnie – astropanic

Powiązane problemy