如果模式已经限制,这些模型验证是否过度?

时间:2011-10-30 06:54:36

标签: ruby-on-rails ruby-on-rails-3

我有一个限制性架构(即架构已经有空限制和最大长度等)。将所有这些都放在模型中也会过度使用并适得其反吗?...

  validates :CouponID,      :presence => true,
                            :numericality => true

  validates :MerchantName,  :presence => true,
                            :length => { :maximum => 100 }

  validates :MerchantID,    :presence => true,
                            :numericality => true

  validates :Network,       :length => { :maximum => 20 }

  validates :Label,         :presence => true

  validates :CouponCode,    :length => { :maximum => 100 }

  validates :EndDate,       :presence => true

  validates :Link,          :presence => true

  validates :Status,        :presence => true,
                            :length => { :maximum => 45 }

  validates :Country,       :length => { :maximum => 100 }

1 个答案:

答案 0 :(得分:4)

不,这不是一种矫枉过正。将这些放入验证器中,您的模型将允许Rails在将它们插入数据库之前捕获它们。这也是很好的设计和实践。

如果省略这些,则会引发MySQL错误。

例如。假设我有一个Comment模型,其中包含一个名为body的属性字符串,在我的表中不能为零。

class Comment < ActiveRecord::Base
end

如果我尝试过:

comment = Comment.create(body: nil)

我会得到以下异常。

ActiveRecord::StatementInvalid: Mysql2::Error: Column 'body' cannot be null:

这很糟糕。应用程序的自然流动会破裂。

但是,如果我将验证器放在我的模型中就像这样

class Comment < ActiveRecord::Base
  validates :body, presence: true
end

并尝试了以下内容:

comment = Comment.create(body: nil)

我不会抛出异常但我的变量的errors数组告诉我出了什么问题。

comment.errors.full_messages
=> ["Body can't be blank"]

将验证器放入模型并进行良好设计是一种很好的做法。