更智能的纸夹验证

19

我在Rails应用中使用Paperclip,在我的模型中有以下三个验证:

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方法支持:unless参数,如下所示:

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

但是这样会破坏应用程序。有没有人有这样做的经验?这将是对Paperclip源代码的一个不错的贡献。

编辑:

我已经尝试使用了这个:

validates_attachment_size :photo, :less_than=>1.megabyte, 
     :unless=> Proc.new { |image| image[:photo].nil? }

但是实际上它并不起作用,因为我刚刚成功上传了一个5mb的mp3文件,并且在此次验证中没有出现错误信息。但这很有前途,因为当用户未附加照片时,错误消息不会出现。


你使用的是哪个版本的Paperclip?我使用的是2.3.1.1,你描述的情况对我来说是自动发生的。如果没有附加文件,它只会返回该错误。如果我附加了一个文件,但大小和内容类型验证失败,那么它就会显示这些错误。 - Peter Brown
很奇怪,因为我也在使用插件的2.3.1.1版本...不过我还是会采纳下面的建议,自己创建自定义错误消息,因为我真的不喜欢它们告诉你附件需要在0到X字节之间的方式。 - stephenmurdoch
我正在使用2.3.2版本,遇到了同样的问题。 - Ben Orozco
2个回答

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

1
更好的写法是::if => Proc.new { |imports| !imports.photo.file? } - Brendon Muir
我不知道这个答案是在哪个版本上给出的,但它在我的本地系统上无法工作(在Rails 3.1.3上运行Paperclip 2.3.11)。 - pcg79

5

我认为你可以用另一种方式来解决这个问题,不要去修改验证。你的表单中可能有类似下面的代码:

<%= f.error_messages %>

您可以删除它并编写自己的帮助程序来显示错误消息。错误存储在哈希中:
@photo.errors

或者如果您想通过表单构建器访问它们:

f.object.errors

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