2012-08-02 85 views
9

我想根據另一個布爾值字段的值將布爾型字段設置爲false。我嘗試了以下ActiveRecord模式:Rails:如何使用before_save根據另一個字段更改字段值?

before_save :reconcile_xvent 

    def reconcile_xvent 
    self.xvent_hood = false if !self.xvent_plenum? 
    end 

但這不起作用。現在,我的許多單元測試失敗:

ActiveRecord::RecordNotSaved: ActiveRecord::RecordNotSaved 

如果xvent_plenum爲false,如何將xvent_hood設置爲false?

更新

這裏是工作(其中一些來自的意見/回答以下問題):

before_validation :reconcile_xvent 

def reconcile_xvent 
    if self.xvent_hood? 
    self.xvent_hood = false unless xvent_plenum? 
    end 
end 

我無法弄清楚,使其沒有「如果自己的工作。 xvent_hood?」部分....

+0

如果'xvent_hood'需要等於'xvent_plenum',也許你應該只是做一個'xvent_hood = xvent_plenum'。 – MurifoX 2012-08-02 17:54:02

+0

但它們並不總是相等的。 xvent_plenum應該能夠爲true,並且xvent_hood爲false。 – croceldon 2012-08-02 17:56:54

+1

然後嘗試使用'unless'。 'self.xvend_hood = false,除非self.xvent_plenum'。 – MurifoX 2012-08-02 17:58:29

回答

11

before_save只有驗證通過後調用。你需要做的是移動reconcile_xvent高達before_validation,而不是before_save

如果保持這種方法before_save會發生什麼事是,它認爲xvent_hood爲空,如果你有檢查的xvent_hood無效驗證它會在before_save被調用之前失敗。這可能解釋了爲什麼你得到了RecordNotSaved錯誤。

另一件事要記住的是,如果你有一個布爾屬性,你也不能使用validate_presence_of。請參閱http://alexanderwong.me/post/16084280769/rails-validate-presence-of-boolean-and-arrays-mongoid

+0

這似乎工作,但爲什麼before_save認爲xvent_hood是空的? – croceldon 2012-08-02 18:08:42

+0

這並不是說before_save認爲xvent_hood是空的,我相信什麼是happend是它在before_save甚至在第一個地方被調用之前未通過驗證。(假設你有適當的驗證,這就是你的記錄沒有保存的原因) – 2012-08-02 18:09:49

+0

將很酷,看到這裏的before_save文檔的鏈接。 – botbot 2015-05-15 08:44:16

16

我剛纔也遇到了這個問題,第一個代碼塊的問題是您將xvent_hood的值指定爲false,然後由before_save方法返回。

取消回調

如果before_ *回調返回false,所有後來的回調和 相關的動作被取消。如果after_ *回調返回false,則 以後的所有回調都將被取消。回調一般在 運行它們被定義的順序,被定義爲 方法的模型,這是最後調用回調的除外。

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

+0

這是正確的答案,但你如何解決這個問題?如何在before_save回調中將boolean賦值爲false? – csi 2015-08-02 22:21:43

+2

要在before_save中將布爾值指定爲false,請確保在回調結束時顯式返回true。 例如: '高清before_save(記錄) my_false_bool =假 還真 end' – lyallward 2015-08-04 01:16:56

+0

這是我第一次看到的紅寶石一個討厭的方式運行,由於它經常省略等關鍵字的回報。 OMFG,這是瘋狂的。 – sakurashinken 2017-07-26 01:21:02

相關問題