在创建时为模型设置默认值的正确方法是什么?

时间:2013-05-29 21:45:33

标签: ruby-on-rails validation default

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

作为一个例子,假设我有一个字段bar,如果在创建记录时没有给出值,我想要默认为0。我还想确保条形不是零,validates_presence_of :bar

如果我这样做:

before_create :defaults
def defaults
  bar ||= 0
end

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

但如果我这样做:

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

......但这看起来有点臭,更不用说效率低下了(每次验证都会调用我在创作时唯一关心的东西)。

是否有一些更优雅的方式我可以在检查验证之前将其默认为0 并且在创建

1 个答案:

答案 0 :(得分:1)

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