【发布时间】:2013-05-29 21:45:33
【问题描述】:
我应该如何设置我的模型,以便在创建记录时设置给定字段的默认值并且我可以在该字段上运行验证?
例如,假设我有一个字段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 检查验证并仅 创建时?
【问题讨论】:
-
我不会说它非常低效。该方法提前退出。我猜你的代码在
Foo#save上花费的时间与其他工作相比可以忽略不计。我会保持原样(因为我不知道更好的方法)。
标签: ruby-on-rails validation default