rails before_create回调在validate工作后中断



我有一个Printer模型,在其中添加了master布尔列。打印机belongs_to :restaurantmaster标志指示该打印机是否是该餐厅的主打印机。

我在打印机模型中有一个方法:

def set_master_on_create
  if self.restaurant.printers.empty?
    self[:master] = true
  else
    self[:master] = false
  end
end

并设置此回调:before_create :set_master_on_create

如果我将此方法作为before_create运行,那么创建新打印机将失败。如果我将回调更改为after_validation,那么创建新对象将完美地工作,即使使用:on => :create选项也是如此。

Rails是否冻结了对象,这样我就不能在某个点之后再更改值,这将导致我得到Rollback?感谢您的帮助。

我在Rails 3.2.2和sqlite上处于开发模式。

我认为问题在于返回false的before_create方法会阻止保存对象。尝试添加return true

我猜你设置的主属性是这样的:self.master = true

def set_master_on_create
  if self.restaurant.printers.empty?
    self.master = true
  else
    self.master = false
  end
  return true
end

如果before_*回调取消了操作,则会发出ROLLBACK。你还可以触发ROLLBACK,在回调,包括after_*钩子。然而,请注意,在这种情况下客户需要意识到这一点,因为普通的储蓄会引发这样的异常而不是悄悄地返回false。http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

最新更新