person = Person.find(4123)
person.destroy #=> false
我有什麼方法可以找出記錄未被刪除的原因?該模型有兩個驗證,都只在創建時觸發。它有一個回調,但回調不會阻止它,如果它失敗。如何找出爲什麼我不能#destroy()記錄?
我沒有追蹤或錯誤來看。
person = Person.find(4123)
person.destroy #=> false
我有什麼方法可以找出記錄未被刪除的原因?該模型有兩個驗證,都只在創建時觸發。它有一個回調,但回調不會阻止它,如果它失敗。如何找出爲什麼我不能#destroy()記錄?
我沒有追蹤或錯誤來看。
我遇到了同樣的問題,這裏是我做了什麼弄清楚是怎麼回事...
首先,該類我試圖破壞對象的,我跑這個圖什麼所有關聯設置爲dependent: :destroy
:
ary = Klass.reflect_on_all_associations
.select { |a| a.options[:dependent] == :destroy }
.map(&:name)
然後我叫我的每一個對象在ary
命名的協會和收集到的結果。這限制了該協會的名稱,只有那些確實有依賴對象:
ary.select! { |a| obj.send(a).any? }
然後我可以嘗試互相破壞這些協會的名稱返回的對象:
destroy_me = obj.send(ary[0]).first
destroy_me.destroy
我只有一個對象,上述情況足以導致破壞失敗。然後,我再去看看對象未能摧毀錯誤:
destroy_me.errors
而這正是我終於看到這是導致破壞失敗的錯誤。從那裏,它是一個簡單的編程問題(SMOP)來解決這個問題。
在我的情況下,有一個before_destroy
回調預防破壞我的一個依賴對象關聯。爲了使今後的調試變得更簡單,我決定開始在Rails失敗回調日誌中記錄錯誤(除了將錯誤消息添加到errors.base
之外)。
你的Rails是什麼版本?在Rails 4中,你可以使用person.destroy!
強制銷燬。如果操作失敗,則會顯示回溯。
這是正確的,這會導致一個ActiveRecord :: RecordNotDestroyed異常 –
現在Rails 3.2,並沒有準備好升級。 – krainboltgreene
這很好,但是您能否擴展您的問題以包含您的「人」模型? – zeantsoi
您應該添加一些調試信息,例如logger.debug並查看您的日誌文件。例如log/production.log如果在生產模式下運行等,你應該能夠找出原因。如果沒有,您可以在這裏發佈相關的日誌文件部分(例如您正在運行的操作),我們可以爲您提供幫助。
你甚至會在哪裏放置日誌語句來解決這個問題? – krainboltgreene
此錯誤通常是由於模型中關聯指定的dependent: :restrict_with_error
引起的。在你的模型定義(以及相關的模型定義)中運行一個快速搜索,看看是否是這種情況。
你在哪個Rails上?請發佈您的人員模型。 – zeantsoi