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

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

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 с этой проверкой на месте. Но это обещает, поскольку сообщение об ошибке не появляется, когда пользователь не присоединил фотографию.

19
задан stephenmurdoch 13 February 2010 в 09:35
поделиться

2 ответа

validates_attachment_size :photo, :less_than => 1.megabyte, 
  :unless => Proc.new { |imports| imports.photo_file_name.blank? }
29
ответ дан 30 November 2019 в 03:48
поделиться

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

<%= f.error_messages %>

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

@photo.errors

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

f.object.errors
5
ответ дан 30 November 2019 в 03:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: