2013-04-30 35 views
2

说我有一个模型,其中我可能需要在保存前操纵它的一些属性:before_validation上:保存VS before_save

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?时不必要的运行回调。

任何强烈的意见?

+1

- 不。没关系。只要做一些让你感觉更好的事情。 – 2013-04-30 09:52:45

回答

6

通常我会将所有数据操作放在before_save中,因为在逻辑上将所有数据操作放在一个位置(保存前)。但是,如果将来要对名称字段进行验证(即使数据操作不影响有效性),您应该将数据操作放在before_validation中,因为您不希望将数据y存储在您的db同时验证数据x。

你可以阅读更多关于此这里:“任何强烈的意见,无论哪种方式” http://bashar3a.com/2011/09/02/activerecord-callback-gotchas-before_save-vs-before_validate/

3

由于您没有实际验证任何内容,但操纵属性,您应该使用before_save回调。

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

1

除非要验证您自己的方法分配给“名称”的值,则可以同时使用这两个值。

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