0

我有一个Printer模型,我添加了一个master布尔列。打印机belongs_to :restaurantmaster标志指示此打印机是否是此餐厅的主打印机。rails回调before_create破坏after_validate的作品

我在打印机模型的方法:

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

,并设置这个回调:如果我运行此方法作为before_create然后创建一个新的打印机将失败before_create :set_master_on_create

。如果我将回调更改为after_validation,即使使用:on => :create选项,创建新对象也能够完美地工作。

是否轨道冻结对象,所以我不能再改变后的某个点,这将导致Rollback我得到的值?任何帮助赞赏。

我在Rails 3.2.2和开发模式下的sqlite。

回答

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_ *挂钩。但是,请注意,在这种情况下,客户端需要注意它,因为普通保存会引起此类异常而不是悄悄返回错误。 http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

+0

哇。这很快,而且很有效。你摇滚!非常感谢 :) – patrickdet 2012-03-04 22:01:10