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

时间:2011-09-30 05:22:19

标签: 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

我编写了一个测试来确保不允许'nil'标题,但是测试得到错误,因为没有定义nil.upcase。我想处理这个错误,但是我已经在before_validation回调之后运行了错误处理。

我不想对所有的before_validation回调进行检查,以确保数据存在,如果可以避免的话。

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

1 个答案:

答案 0 :(得分:6)

检查你是否有头衔。并且不要忘记保存修改后的标题。

def capitalize_title
  title = title.upcase if title
end

如果您需要使用before_validation挂钩进行修补,那么您将无法在两个位置处理无效数据。如果你的验证很复杂,你可以把它分成两部分:一部分在before_validation可以运行之前必须是真的,一部分必须是真的之后 {{1}已经运行:

before_validation