Подтвердить что ты не робот

Умные проверки скрепки

Я использую paperclip в приложении 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

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

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

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

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

EDIT:

Я пробовал использовать это:

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

<%= f.error_messages %>

Вы можете удалить его и написать свой собственный помощник, чтобы отображать сообщения об ошибках. Ошибки сохраняются в хеше:

@photo.errors

Или если вы хотите добраться до них через построитель форм:

f.object.errors