【问题标题】:How should my Rails before_validation callbacks handle bad data?我的 Rails before_validation 回调应该如何处理错误数据?
【发布时间】:2011-09-30 05:22:19
【问题描述】:

我有几个 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 回调以确保数据存在。

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

【问题讨论】:

  • captialize_title 方法应该有一个检查,正如 mu 所建议的那样。如果您要直接从某些代码中调用该方法并且 title 为 nil 怎么办 - 您会收到错误,因此该代码原样不好。此外,在这种情况下,您正在对方法进行检查,而不是对 before_validate 回调进行检查 - 不确定在回调周围进行检查是什么意思。

标签: ruby-on-rails ruby-on-rails-3.1


【解决方案1】:

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

def capitalize_title
  title = title.upcase if title
end

如果您需要使用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

【讨论】:

  • 我担心的是,由于一系列复杂的回调对几位数据进行操作,我需要在我的代码中添加这些条件。也许这是不可避免的。
  • @Nathan:您也许可以将您的验证分为两部分,我添加了一个概述总体思路的更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多