更智能的回形针validation
我在rails应用程序中使用paperclip,并在我的模型中进行以下三次validation
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']
如果用户忘记添加附件,则所有三个validation都会失败,因此会向用户显示以下三个错误:
# 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
我认为最好只显示此实例中的第一个错误,因为其他两个错误纯粹是后果…我希望用户只有在添加附件但不符合时才会看到后两个错误validation标准。
我确定没有预先出现的validation可以做这种事情,并且通过阅读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
但这打破了应用程序。 有没有经验做过这种事情? 对回形针源代码的贡献很大。
编辑:
我试过用这个:
validates_attachment_size :photo, :less_than=>1.megabyte, :unless=> Proc.new { |image| image[:photo].nil? }
虽然因为我已经设法上传了一个带有这个validation的5mb mp3,但它并没有完全奏效。 但它很有希望,因为当用户没有附加照片时,不会出现错误消息。
validates_attachment_size :photo, :less_than => 1.megabyte, :unless => Proc.new { |imports| imports.photo_file_name.blank? }
我想你可以通过其他方式做到这一点。 不要乱用validation。 您的表单中可能包含以下内容:
<%= f.error_messages %>
您可以删除它并编写自己的帮助程序来显示错误消息。 错误存储在哈希中:
@photo.errors
或者,如果您想通过表单构建器访问它们:
f.object.errors