Intelligentere Validierung von Büroklammern

Ich verwende Büroklammern in einer Schienen-App und habe die folgenden drei Validierungen in meinem Modell

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'] 

Wenn der Benutzer vergisst, einen Anhang hinzuzufügen, schlagen alle drei Überprüfungen fehl, und dem Benutzer werden daher die folgenden drei Fehler angezeigt:

# 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

Ich denke, es wäre am besten, in diesem Fall nur den ersten Fehler anzuzeigen, da die beiden anderen Fehler rein folgerichtig sind. Ich würde es vorziehen, wenn der Benutzer die beiden zweiten Fehler nur dann sieht, wenn ein Anhang hinzugefügt wurde, dieser jedoch nicht übereinstimmt die Validierungskriterien.

Ich bin mir sicher, dass es keine vorgebackene Validierung gibt, die so etwas macht. Aus dem Lesen des Codes in vendor / plugins / paperclip / lib / paperclip.rb geht hervor, dass die validates_attachment_size-Methode Folgendes unterstützt:

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

Also dachte ich, ich könnte so etwas tun:

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

Aber das bricht die App. Hat jemand Erfahrung damit? Wäre ein netter Beitrag zum Büroklammer-Quellcode.

BEARBEITEN:

Ich habe versucht, dies zu verwenden:

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

Es funktioniert jedoch nicht ganz, da ich es gerade geschafft habe, ein 5-MB-MP3 mit dieser Überprüfung hochzuladen. Es ist jedoch vielversprechend, da die Fehlermeldung nicht angezeigt wird, wenn der Benutzer kein Foto angehängt hat.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage