【问题标题】:Ruby on Rails: Why do I include allow_blank in my validation if I test for presence already?Ruby on Rails:如果我已经测试存在,为什么还要在验证中包含 allow_blank?
【发布时间】:2013-06-05 01:24:03
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails sqlite activerecord


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您向我解释这一点。因此,鉴于第一个验证执行了两个更严格的验证,第四个是多余的?
    • 第四次验证仍在检查一个有效的图像文件扩展名,所以整个事情不是多余的;但是,是的,allow_blank 部分被更严格的第一次验证覆盖。另一种思考方式:您不能通过添加更多验证语句来放松模型的验证。额外的 validates 语句要么无效,要么加强整个模型的验证。
    • dliggat:小心。问题是关于 Rails,最新版本的 Rails 扩展了数组类以包含空白?方法。 [ ]。空白的?在 Rails 中是一个有效的测试,相当于 [ ].empty?
    • 糟糕。我应该添加 Hash 类。空白?方法在 Rails 中对 Array 和 Hash 都有效。
    【解决方案2】:

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

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

    【讨论】:

    • 这条线已经测试了存在:validates :description, :title, :image_url, presence: true 抱歉,如果我不清楚。
    【解决方案3】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多