我有几个 before_validation 回调,它们对我的模型上设置的属性进行操作。当我遇到这样的情况时,我遇到了麻烦:
class Foo < ActiveRecord::Base
before_validation :capitalize_title
validates :title, :presence => true
def capitalize_title
title.upcase
end
end
我编写了一个测试来确保不允许使用“nil”标题,但由于未定义 nil.upcase,该测试出现错误。我想处理这个错误,但我已经有了在 before_validation 回调之后运行的错误处理。
如果可以避免的话,我不想检查所有 before_validation 回调以确保数据存在。
有没有一种干净的或公认的方法来处理这种情况?
最佳答案
只需检查您是否有标题。并且不要忘记保存修改后的标题。
def capitalize_title
title = title.upcase if title
end
如果您需要使用 before_validation
Hook 进行修补,那么您将不得不在两个地方处理无效数据。如果您的验证很复杂,您可以将其分为两部分:一部分必须在 before_validation
运行之前为真,另一部分必须为 之后 before_validation
已运行:
before_validation :mangle_data
validate :data_is_okay
#...
def mangle_data
return if(!data_is_mangleable)
#... mangle away
end
def date_is_okay
if(!data_is_mangleable)
# complain
end
if(!data_is_properly_mangled)
# complain some more
end
end
def data_is_mangleable
return false if(thing.nil?)
# etc.
end
def data_is_properly_mangled
# check that stuff that the before_validation hook doesn't
# have to care about.
end
关于ruby-on-rails - 我的 Rails before_validation 回调应该如何处理错误数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7606244/