Меня удивило, насколько сложно было найти четкий способ проверки ширины и высоты изображения с помощью CarrierWave. Приведенное выше решение @ Кира является правильным, но я хотел сделать шаг вперед, объяснив, что он сделал, и незначительные изменения, которые я сделал.
Если вы посмотрите на его суть https://gist.github.com/1239078,, ответ лежит в обратном вызове before :cache
, который он имеет в классе Uploader. Волшебная линия
model.avatar_upload_width, model.avatar_upload_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i }
в его случае, avatar_upload_width & avatar_upload_height являются атрибутами его пользовательской модели. Я не хотел иметь для хранения ширины и высоты в базе данных, поэтому в моей модели я сказал:
attr_accessor :image_width, :image_height
Помните, вы можете использовать attr_accessor для атрибутов, которые вы хотите иметь под рукой, когда возитесь с записью, но просто не хотите сохранять их в БД. Так что моя магическая линия фактически превратилась в
model.image_width, model.image_height = `identify -format "%wx %h" #{new_file.path}`.split(/x/).map { |dim| dim.to_i }
Так что теперь у меня есть ширина и высота моего изображения, хранящегося в объекте модели. Последний шаг - написать пользовательскую проверку для измерений, поэтому в вашей модели вам нужно что-то вроде
validate :validate_minimum_image_size
А затем под ним определите свой пользовательский метод проверки, такой же, как в gist
# custom validation for image width & height minimum dimensions
def validate_minimum_image_size
if self.image_width < 400 && self.image_height < 400
errors.add :image, "should be 400x400px minimum!"
end
end