我的Rails before_validation回调如何处理坏数据?

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回调中放置检查以确保数据存在,如果我可以避免它.

是否有一种干净或可接受的方式来处理这种情况?

mu *_*ort 6

只需检查您是否有标题.并且不要忘记保存修改后的标题.

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)