PaperClip - 如何根据尺寸跳过保存附件

时间:2011-04-06 05:27:57

标签: ruby ruby-on-rails-3 paperclip

我有一个带回形针的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 个答案:

答案 0 :(得分:1)

您声称自己不想提出错误以便保存。在这种情况下,只需使用:before_validate回调:

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或其他内容中传递它(显然您不能使用错误或无法保存)。

attachment.dirty?上面的行是一个小的增强功能,因此您不必在每次保存模型时不断检查附件,而只在上载新附件时。如果您在S3上存储文件,这一点尤为重要。

答案 1 :(得分:0)

你为什么不想保存它?如果你希望它继续下去,那么一个简单的解决方案就是不进行验证,但可以像before_save,before_create或after_save回调一样进行验证。

最简单的事情可能是在before_save中,如果它没有通过测试,只需删除它,然后保存。

答案 2 :(得分:0)

您可以从ActiveRecord::RecordInvalid

进行救援