Nat*_*sos 2 ruby-on-rails ruby-on-rails-3.1
我有几个before_validation回调函数对我的模型上设置的属性进行操作.当我遇到这样的情况时,我遇到了麻烦:
class Foo < ActiveRecord::Base
before_validation :capitalize_title
validates :title, :presence => true
def capitalize_title
title.upcase
end
end
Run Code Online (Sandbox Code Playgroud)
我编写了一个测试来确保不允许'nil'标题,但是测试得到错误,因为没有定义nil.upcase.我想处理这个错误,但我已经有在before_validation回调之后运行的错误处理.
我不想在我的所有before_validation回调中放置检查以确保数据存在,如果我可以避免它.
是否有一种干净或可接受的方式来处理这种情况?
只需检查您是否有标题.并且不要忘记保存修改后的标题.
def capitalize_title
title = title.upcase if title
end
Run Code Online (Sandbox Code Playgroud)
如果您需要使用before_validation钩子进行修补,那么您将无法在两个地方处理无效数据.如果您的验证很复杂,您可以将它分为两部分:一部分必须在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
Run Code Online (Sandbox Code Playgroud)