2

假设我有一个模型,我可能需要在保存它之前操作它的一些属性:

class User < ActiveRecord::Base

  attr_accessible :name, :email

  # before_validation :set_name_from_email, on: :save
  # OR
  # before_save :set_name_from_email

  def set_name_from_email
    self.name ||= email
  end

end

如果我必须validates :name, presence: true那么当然这将不得不进入before_validation. 但是,如果(按照现在的代码)回调没有机会影响对象的有效性,那么将其放入是否更好before_save

让所有数据在一个或另一个存储桶中处理回调似乎更整洁,以防代码更改并且回调现在可能会影响有效性,但是在调用诸如.valid?.

有什么强烈的意见吗?

4

3 回答 3

8

通常我会将所有数据操作放在 中,before_save因为将所有数据操作放在一个地方(在保存之前)是合乎逻辑的。

但是,如果您将来要对 name 字段进行验证(即使数据操作不影响有效性),您应该将数据操作放在 a 中before_validation,因为您不希望在验证数据时将数据 y 存储在数据库中 x .

您可以在此处阅读有关此内容的更多信息:http: //bashar3a.com/2011/09/02/activerecord-callback-gotchas-before_save-vs-before_validate/

于 2013-04-30T10:04:25.203 回答
3

由于您实际上并未验证任何内容,而是操作属性,因此您应该使用before_save回调。

自定义验证方法通常会向模型添加错误,而您set_name_from_email并没有这样做。

于 2013-04-30T09:58:05.700 回答
2

除非您想验证您自己的方法分配给 "name" 的值,否则您可以同时使用两者。

但是,如果您的方法可能导致无效名称,您应该使用 before_validation。

于 2013-04-30T10:00:06.677 回答