0

我应该如何设置我的模型,以便在创建记录时设置给定字段的默认值,并且我可以在该字段上运行验证?

例如,假设我有一个字段bar,如果在创建记录时没有给出值,我想将其默认为 0。我还想确保 bar 不为零,带有validates_presence_of :bar.

如果我这样做:

before_create :defaults
def defaults
  bar ||= 0
end

...那么默认值永远不会起作用;验证失败,因为 bar 在调用默认值之前为零。

但如果我这样做:

before_validation :defaults
def defaults
  bar ||= 0
end

然后在每次验证之前设置默认值,这使得以下产生一些奇怪的结果:

foo = Foo.new
foo.bar = nil
foo.save!

不是因为您尝试将 bar 设置为无效值而引发异常,而是保存成功并将 bar 设置为 0。

我想我可以这样做:

before_validation :defaults
def defaults
  if new_record?
    bar ||= 0
    # set any other default values
  end
end

...但这似乎有点臭,更不用说效率低下(我只在创建时关心的是每次验证都被调用)。

是否有一些更优雅的方法可以在检查验证之前将 bar 默认设置为 0 并且在创建时?

4

1 回答 1

1

before_validation :defaults, :on => :create,它只会在创建时被调用。

于 2013-05-29T21:52:37.993 回答