rails callback before_create broken after_validate有效

时间:2012-03-04 21:43:18

标签: ruby-on-rails ruby-on-rails-3 callback activemodel rails-models

我有一个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。

1 个答案:

答案 0 :(得分:1)

我认为问题是返回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_ * hooks。但请注意,在那种情况下   客户需要注意它,因为普通的保存会提高   这样的例外,而不是悄悄地返回false。   http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html