ruby-on-rails - 更智能的回形针验证

标签 ruby-on-rails model paperclip validation

我在Rails应用中使用回形针,并在模型中进行了以下三个验证

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


但这破坏了应用程序。任何人都有做这种事情的经验吗?将对回形针源代码做出很好的贡献。

编辑:

我试过使用这个:

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


不过,由于我已经成功上传了5 mb mp3的音频,因此无法正常运行。但这很有希望,因为当用户未附加照片时错误消息不会出现。

最佳答案

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

关于ruby-on-rails - 更智能的回形针验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2257041/

相关文章:

ruby-on-rails - 尝试在测试中运行 rails c 时获取 config.eager_load 设置为 nil

ruby-on-rails-3 - 将 ActiveAdmin 用户与现有用户模型合并

ruby-on-rails - 办公文件(docx、pptx)的回形针上传正在下载为 zip 文件?

ruby-on-rails - 在 case 语句中使用 &&

ruby-on-rails - 链接到同一行前面的图标

javascript - Backbone.Models this.get() 是复制整个数组还是指向内存中的同一个数组

ruby-on-rails - Paperclip 在 Rails 中将图像上传到 S3。文件上传速度非常慢。解决方法?

ruby-on-rails - 回形针图片网址

ruby-on-rails - 删除 rails 中的多个项目的 Restful 方法是什么?

cakephp - 上传声明:: beforeSave()应该与Model::beforeSave($ options = Array)兼容[APP/Model/Upload.php,第5行]