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