PaperClip - Как пропустить вложение из сохранения на основе размеров - PullRequest
3 голосов
/ 06 апреля 2011

У меня есть приложение rails 3 со скрепкой. Если вложение является изображением, а ширина или высота изображения меньше 100, я хочу пропустить его из сохраненного.

У меня в модели следующее:

  validate :file_dimensions, :unless => "errors.any?"

  def file_dimensions
    dimensions = Paperclip::Geometry.from_file(attachment.to_file(:original))
    if dimensions.width < 100 || dimensions.height < 100
      errors.add(:file,'Width or height must be at least 100px')
    end
  end

Проблема в том, что я не хочу выдавать сообщение об ошибке, потому что тогда все задание не выполняется, я просто хочу, чтобы скрепка пропустила вложение и не остановила весь процесс.

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

Вы утверждаете, что не хотите выдавать ошибку, поэтому можете сохранить.В этом случае просто используйте :before_validate callback:

before_validate :check_file_dimensions

def check_file_dimensions
  if attachment.dirty?
    dimensions = Paperclip::Geometry.from_file(attachment.to_file(:original))
    if dimensions.width < 100 || dimensions.height < 100
      attachment.clear
    end
  end
end

Конечно, если вы хотите показать сообщение об ошибке пользователю, вам нужно будет передать его в экземпляре var или что-то еще (очевидно, вы можетене используйте ошибки или не сохраните).

Вложение. Грязное?строка выше - это небольшое улучшение, так что вы не будете постоянно проверять вложение каждый раз, когда сохраняете модель, а только при загрузке нового вложения.Это особенно важно, если вы храните файлы на S3.

0 голосов
/ 07 апреля 2011

Вы можете просто спасти от ActiveRecord::RecordInvalid

0 голосов
/ 07 апреля 2011

Почему вы не хотите его сохранить? Если вы хотите, чтобы он продолжал работать, то простое решение состоит в том, чтобы не делать его валидацией, а поместить его как обратный вызов before_save, before_create или after_save.

Вероятно, самая простая вещь была бы в before_save, если она не прошла ваши тесты, просто удалите ее и сохраните.

...