10

如您所知,before_save回调在回调之前执行before_create

因此,有人建议最好使用 inbefore_save :method, :on => :create而不是before_create这样,回调方法相对于其他回调(例如自动保存回调)在正确的时间执行。例如,请参阅此Pivotal Labs 博客文章此 StackOverflow 答案

但是,据我所知,该选项对回调:on => :create没有达到预期的效果。before_save换句话说,无论是否创建,每次保存都会执行回调。

不过,该:on => :create选项似乎before_validation回调有效。

有人可以确认是否:on => :create应该为 a 工作before_save?它是否在以前的 Rails 版本中工作并且现在已损坏,或者上述链接只是错误的?

假设:on => :create无效,以下是否可以接受,和/或有更好的方法吗?

before_save :callback_method, :if => :new_record?

谢谢你。

4

1 回答 1

19

你是对的,没有回调:on选项。before_save但是,我不明白,为什么要使用before_save而不是before_create. before_create回调将在之后被调用before_save

当然,您可以使用before_save :callback_method, :if => :new_record?. 但我个人不喜欢这个解决方案——如果我需要在:if选项中添加条件怎么办?

before_save如果一个和回调之间有依赖关系before_create,我建议将两个回调结合起来。例如(伪代码):

class MyModel < ActiveRecord::Base
  before_create :prepare_x
  before_save :do_something_with_x

  def prepare_x
    @x = 10
  end


  # will not work, because `prepare_x` called after `do_something_with_x`
  def do_something_with_x
    @a = 100 / @x
  end
end

# ||
# ||
# \/

class MyModel < ActiveRecord::Base

  before_save :do_something_with_x

  def do_something_with_x
    @x = 10 if new_record?
    @a = 100 / @x
  end
end
于 2012-05-17T17:56:20.140 回答