noAh's Steps on Rails or sth. Else.

Whatever, keep going ahead.
  首页  :: 新随笔  :: 管理

AWDwR depot例程 约束条件

Posted on 2008-10-30 09:34  noAh....  阅读(345)  评论(0)    收藏  举报

  我们忽然发现一个很严肃的问题。在我们输入的信息当中,价格为负数甚至是字母都是可以保存下来的。这样会导致一个严重的后果,加入某天店主一个失误输了一个负数进去,那岂不是要还买方的钱还要送货?所以为了提防这样的情况,我们必须为我们的数据加上一些约束条件,比如货物名(书籍名)不能为空,价钱不能缺失不能为负。

  打开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必须为数字,否则不符合输入条件。
 wrong number
  我们再添加一个使得价格必须大于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

  这样子我们在输入的时候就安全多了。