我们忽然发现一个很严肃的问题。在我们输入的信息当中,价格为负数甚至是字母都是可以保存下来的。这样会导致一个严重的后果,加入某天店主一个失误输了一个负数进去,那岂不是要还买方的钱还要送货?所以为了提防这样的情况,我们必须为我们的数据加上一些约束条件,比如货物名(书籍名)不能为空,价钱不能缺失不能为负。
打开app/models/product.rb
class Product < ActiveRecord::Base
end
我们在Product类里面添加一句
validates_presence_of :title, :description, :image_url
validates_presence_of 方法是rails中标准的确认方法,它的作用是,确定输入的信息不为空。我们转到页面是看看是什么情况。

新建一个product,信息都为空时就提交,会给出醒目的错误信息:输入信息不符合要求的输入框会被红色包围(此处与AEDwR上面有所不符,书上面的说法是,仅仅有红线圈一下输入框,但是实际上,整个输入框的右边都红了)。
title, description, image_url三个的值都不为空时,才能保存信息。
我们继续添加其他的约束条件。
validates_numericality_of :price
此约束条件要求输入的price必须为数字,否则不符合输入条件。

我们再添加一个使得价格必须大于0.01(1 cent)的约束
validate :price_must_be_at_least_a_cent
protected
def price_must_be_at_least_a_cent
errors.add(:price, "should be at least 0.01") if price.nil? ||
price < 0.01
end
image_url(图片链接)必须以jpg, gif, png结尾的约束条件。
balidates_format_of :image_url,
:with => %r{\.(gif|jpg|png)$}i,
:message => "must be a URL for Gif, JPG" +
"or PNG image.(gif|jpg|png)"
整个app/models/product.rb的源码为
class Product < ActiveRecord::Base
validates_presence_of :title, :description, :image_url
validates_numericality_of :price
validate :price_must_be_at_least_a_cent
validates_uniqueness_of :title
validates_format_of :image_url,
:with => %r{\.(gif|jpg|png)$}i,
:message => "must be a URL for GIF, JPG " +
"or PNG image.(gif|jpg|png)"
protected
def price_must_be_at_least_a_cent
errors.add(:price, "should be at least 0.01") if price.nil? ||
price < 0.01
end
end