validate_presence_of在调用before_save之前或之后触发?

时间:2011-02-17 05:03:25

标签: ruby-on-rails

在'before_save'事件之前调用val_presence_of吗?

如何在模型的属性上设置默认值?

2 个答案:

答案 0 :(得分:1)

使用before_validation回调:

class User
  before_validation(:on => :create) do
    self.time_zone ||= "Blah"
  end
end

答案 1 :(得分:0)

是的,所有验证都会在 before_save回调被触发之前运行。有关订单的完整列表,请参阅http://guides.rubyonrails.org/active_record_validations_callbacks.html#available-callbacks

我建议使用after_initialize。这就是它的目的。这意味着当它们从数据库加载时以及首次创建时都会调用它。换句话说,它们的属性与您期望的一致。

class User
  def after_initialization
    self.foobar ||= 'default value'
  end
end

来自docs

  

after_initialize回调将是   只要有活动记录就会调用   对象被实例化,或者通过   直接使用new或记录时   从数据库加载。有可能   有用的是避免直接需要   覆盖您的Active Record初始化   方法

     

将调用after_find回调   每当Active Record加载记录时   来自数据库。 after_find是   之前调用after_initialize如果两者都有   已定义。

     

after_initialize和after_find   回调有点不同   其他。他们之前没有*   同行,唯一的方法   注册它们是通过将它们定义为   常规方法。如果你试着   注册after_initialize或   after_find使用宏样式类   方法,他们将被忽略。   此行为是由于性能   原因,因为after_initialize和   将同时调用after_find   在数据库中找到的每条记录,   显着放慢了   查询。