0

我正在通过使用 Rails 4e 进行敏捷 Web 开发一书来学习 Rails。到目前为止,它使用以下作为我们的产品模型(改编自脚手架):

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 为空,我如何在我的代码中测试它是否为空?(例如在产品视图中显示默认图像。)

4

3 回答 3

2

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

它可能是错误的形式,并且在第四次验证中显然令人困惑allow_blank: true,但这仅适用于该单一语句。该模型必须通过所有验证才能被视为有效,因此第 1 条语句仅施加比第 4 条更严格的限制。

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

于 2013-06-05T03:39:02.383 回答
0

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

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

然后,您应该会看到字段为空白和文件格式错误的验证错误。

因此,allow_blank 告诉验证,一旦该字段不再为空白,文件格式就会出错。

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

于 2013-09-18T19:41:32.977 回答
0

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

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

于 2013-06-05T01:36:53.410 回答