Более умные проверки скрепки

Я использую скрепку в приложении rails и у меня в модели есть следующие три подтверждения

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

Если пользователь забывает добавить вложение, все три проверки завершаются неудачно и, таким образом, пользователю выдаются следующие три ошибки:

# 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

Я думаю, что было бы лучше просто показать первую ошибку в этом случае, так как две другие ошибки являются чисто косвенными ... Я бы предпочел, чтобы пользователь только когда-либо видел вторые две ошибки, если вложение было добавлено, но не соответствует критерии проверки.

Я уверен, что не существует предварительно запеченной проверки, которая делает подобные вещи, и, прочитав код в vendor / plugins / paperclip / lib / paperclip.rb, я вижу, что метод validates_attachment_size поддерживает:

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

Итак, я думал, что мог бы сделать что-то вроде следующего:

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

Но это ломает приложение. У кого-нибудь есть опыт такого рода вещей? Было бы хорошим вкладом в исходный код скрепки.

РЕДАКТИРОВАТЬ:

Я пытался использовать это:

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

Это не совсем работает, хотя мне только что удалось загрузить 5 Мб mp3 с этой проверкой на месте. Но это многообещающе, так как сообщение об ошибке не появляется, когда пользователь не прикрепил фотографию.

Ответы на вопрос(2)

Ваш ответ на вопрос