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

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

问题是我不想因为一个错误而导致整个任务失败,我只希望Paperclip跳过保存该附件,并且不会停止整个过程。

3个回答

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

当然,如果您想向用户显示错误消息,您需要通过实例变量或其他方式传递它(显然,您不能使用错误,否则它不会保存)。

上面的attachment.dirty?行是一个小增强功能,这样您就不必每次保存模型时都不断检查附件,而只有在上传新附件时才检查。如果您将文件存储在S3上,则尤其重要。


我从 :before_validate 得到了一个 method_missing 错误。最终我使用 :before_validation 来获得相同的功能。http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html#M000064 - kelly.dunn

0

为什么你不想保存它呢?如果你想让它继续进行,那么一个简单的解决方案是不要将其作为验证,而是可以将其放在 before_save、before_create 或 after_save 回调中。

可能最简单的方法是在 before_save 中,如果它没有通过你的测试,就删除它,然后保存。


0

你可以直接从 ActiveRecord::RecordInvalid 中进行救援


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接