我正在学习使用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为空,我如何在代码中测试它是否为空? (例如,在产品视图中显示默认图像。)
答案 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就会告诉验证只对文件格式出错。
我也很困惑,这就是我最终来到这里的原因!