是:on =>:对Rails 3.2.3中的before_save回调创建有效

Nat*_*han 8 activerecord ruby-on-rails before-save ruby-on-rails-3.2

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

因此,有些人建议使用in before_save :method, :on => :create而不是before_create使得回调方法在适当的时间执行与其他回调(例如自动保存回调)相关.例如,请参阅此Pivotal Labs博客文章以及此StackOverflow答案.

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

:on => :create选项似乎是有效的before_validation回调,虽然.

有人可以确认是否:on => :create应该适用于before_save?它是否在以前的Rails版本中有效并且现在已经坏了,或者前面提到的链接是错误的?

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

before_save :callback_method, :if => :new_record?
Run Code Online (Sandbox Code Playgroud)

谢谢.

cut*_*ion 17

你说得对,没有:on供选择before_save回调.但是,我不明白,为什么要用before_save而不是before_create. before_create回调将在之后立即调用before_save.

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

如果一个人在回调before_savebefore_create回调之间存在依赖关系,我建议组合2个回调.例如(伪代码):

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
Run Code Online (Sandbox Code Playgroud)

  • `before_save:on =>:create`无声地失败,这太糟糕了.如果它工作或抛出异常会很好. (2认同)