2010-02-13 4 views
19

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

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 поддерживает: if параметр as показано:

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? } 

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

+0

Какую версию скрепки вы используете? У меня есть 2.3.1.1, и то, что вы описываете, происходит автоматически для меня. Если файл не прикреплен, он возвращает только эту ошибку. Если я присоединяю файл, но проверки размера и типа содержимого терпят неудачу, он показывает эти ошибки. –

+0

странно, потому что я тоже 2.3.1.1 плагина ... я собираюсь пойти с предложением ниже о создании моих собственных сообщений об ошибках в любом случае, потому что мне действительно не нравится, как они сообщают вам о необходимых потребностях чтобы быть между 0 и X байтами .... – stephenmurdoch

+0

Я использую 2.3.2 с той же проблемой –

ответ

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

это прекрасно - спасибо. – stephenmurdoch

+1

Лучше, чем:: if => Proc.new {| import | ! Imports.photo.file? } –

+0

Я не знаю, в какую версию был дан этот ответ, но он не работает в моей локальной системе (работает Paperclip 2.3.11 на Rails 3.1.3). – pcg79

5

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

<%= f.error_messages %> 

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

@photo.errors 

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

f.object.errors 
+0

Приятный подход, умный – astropanic

Смежные вопросы