ruby-on-rails - 我的 Rails before_validation 回调应该如何处理错误数据?

标签 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 回调以确保数据存在。

有没有一种干净的或公认的方法来处理这种情况?

最佳答案

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

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/

相关文章:

html - Bootstrap 卡对齐不正确

javascript - Rails 的综合 ajax 页面

ruby-on-rails - 不允许发布返回 405 方法

ruby-on-rails - Rails 3.1 中错误消息的嵌套模型属性本地化

mysql - Rails 3.1.2 运行非常非常慢。貌似是mysql2 ActiveRecord开发模式的问题

ruby-on-rails - Rails 3.1 Assets 管道预编译错误 - 找不到文件 'jquery'

ruby-on-rails - Rails Runner 抛出 : undefined local variable or method `app' for main:Object (NameError)

ruby-on-rails - 使用 Solr (Sunspot) 索引整数列表

ruby-on-rails - 如何将 Devise 的 'timeoutable' 模块添加到现有的 Devise 安装中? - rails 3.1

ruby-on-rails - 使用 cancan 时如何设置范围集中分配?