2013-05-27 41 views
19
person = Person.find(4123) 
person.destroy #=> false 

我有什麼方法可以找出記錄未被刪除的原因?該模型有兩個驗證,都只在創建時觸發。它有一個回調,但回調不會阻止它,如果它失敗。如何找出爲什麼我不能#destroy()記錄?

我沒有追蹤或錯誤來看。

+0

你在哪個Rails上?請發佈您的人員模型。 – zeantsoi

回答

20

我遇到了同樣的問題,這裏是我做了什麼弄清楚是怎麼回事...

首先,該類我試圖破壞對象的,我跑這個圖什麼所有關聯設置爲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之外)。

+0

謝謝,幫了我很多!在我的情況下,我只是在'before_destroy'方法中'返回false',以防止破壞對象。 – guyaloni

+1

我對第二代碼塊有點困惑。現在,它將根據對象是否具有任何第一個關聯來選擇「ary」中的全部或全部關聯。應該是'ary.select! {| a | obj.send(一).ANY?而不是? – Aaron

2

你的Rails是什麼版本?在Rails 4中,你可以使用person.destroy!強制銷燬。如果操作失敗,則會顯示回溯。

+0

這是正確的,這會導致一個ActiveRecord :: RecordNotDestroyed異常 –

+0

現在Rails 3.2,並沒有準備好升級。 – krainboltgreene

+0

這很好,但是您能否擴展您的問題以包含您的「人」模型? – zeantsoi

0

您應該添加一些調試信息,例如logger.debug並查看您的日誌文件。例如log/production.log如果在生產模式下運行等,你應該能夠找出原因。如果沒有,您可以在這裏發佈相關的日誌文件部分(例如您正在運行的操作),我們可以爲您提供幫助。

+1

你甚至會在哪裏放置日誌語句來解決這個問題? – krainboltgreene

2

此錯誤通常是由於模型中關聯指定的dependent: :restrict_with_error引起的。在你的模型定義(以及相關的模型定義)中運行一個快速搜索,看看是否是這種情況。

相關問題