Ruby on Rails:如果我已经测试了存在,为什么我在验证中包含allow_blank?

时间:2013-06-05 01:24:03

标签: ruby-on-rails sqlite activerecord

我正在学习使用Rails 4e的Agile Web开发一书。到目前为止,我们使用以下产品模型(改编自脚手架):

class Product < ActiveRecord::Base
  attr_accessible :description, :image_url, :price, :title

  validates :description, :title, :image_url, presence: true
  validates :price, numericality: {greater_than_or_equal_to: 0.01}
  validates :title, uniqueness: true
  validates :image_url, allow_blank: true, format: {
    with: %r{\.(gif|jpg|png)$}i,
    message: 'Must be a valid URL for a gif, png, or jpg..'
  }
end

我想知道为什么它首先测试是否存在:image_url,但是在第三次验证中确保图像url有效,它允许空白响应与第一次验证相矛盾。我不明白为什么这应该按原样运作。

另外一个问题是,如果image_url为空,我如何在代码中测试它是否为空? (例如,在产品视图中显示默认图像。)

3 个答案:

答案 0 :(得分:2)

模型验证是单独测试的。当且仅当模型独立地通过每个验证语句的验证时,模型才有效。

这可能是错误的形式,并且明显混淆了allow_blank: true在第4次验证中,但这只适用于那个单一的声明。模型必须通过所有验证才能被认为是有效的,因此第1个陈述仅比第4个陈述更严格的限制。

最后一点,请注意presence测试非nilness,而blank定义为nil或空字符串。因此可以存在和空白;例如image_url = ''。但是,仍然需要单独测试验证。

答案 1 :(得分:0)

我想您可能对验证码感到困惑?我是菜鸟,这可能不完全准确:validates关键字不测试存在,它启动一个用于指定验证的块。

按原样,您的代码将根据您的规范验证:image_url(如果存在)。如果你取出allow_blank:true,那么一个不存在或空白:image_url将无法通过验证。

答案 2 :(得分:0)

我也是Rails的新手,并且正在使用同一本书。我的理解是,为了停止验证,立即对验证返回两个错误(即如果字段为空,则为一个,如果没有正确的文件扩展名,则为一个),它必须allow_blank用于文件格式。

我可以解释的最好方法是建议删除allow_blank: true代码并尝试再次提交说明表单。

然后,您应该看到该字段的验证错误都是空白且文件格式错误。

一旦字段不再为空,allow_blank就会告诉验证只对文件格式出错。

我也很困惑,这就是我最终来到这里的原因!