有沒有什麼辦法,給定某些條件,取消銷燬活動記錄的before_destroy回調對象?謝謝Rails - 取消銷燬before_destroy回調
回答
您應該返回false
。
Rails的5
「取消回調
如果before_ *回調拋出:中止,所有後來的回調和相關動作被取消。」
軌道4,下
「取消回調
如果before_ *回調返回false,所有後來的回調和相關動作被取消。回調通常是在順序運行它們被定義,在模型中被定義爲方法的回調的例外,這被稱爲last。「
導軌包裹保存,並在交易破壞,所以在回調raise
將工作:
class Post < ActiveRecord::Base
before_destroy :saveable?
def saveable?
if true
raise "Destroy aborted; you can't do that!"
end
end
end
替代true
你的病情。
下面是刪節控制檯輸出:
[1] pry(main)> Post.first.id
=> 1
[2] pry(main)> Post.first.destroy
RuntimeError: Destroy aborted; you can't do that!
[3] pry(main)> Post.first.id
=> 1
thnks,但不希望它引發任何事情......什麼都不做 –
有道理。因爲這是'before_ *'回調函數,所以'raise'或'false'都可以。 「提升」的好處是你會得到一個明確的信息,你可以在日誌中追蹤,而不是「摧毀」悄悄地沒有發生。選擇哪個取決於您的失敗情況可能會如何意外。 –
在Rails 5中,你將不得不明確地提出:中止。你現在可以開始了。 – mwoods79
返回false
是做正確的方法:你可以看到在點6 Halting Execution
這裏的文檔
before_destroy do
if self.some_condition?
return false
end
end
。 http://guides.rubyonrails.org/active_record_callbacks.html
您也可以覆蓋#destroy
方法:
def destroy
study_assignments.empty? ? super : self
end
- 1. Rails 3覆蓋銷燬無需取消回調並觸發ROLLBACK
- 2. before_destroy和依賴銷燬不點火
- 3. mongoid before_destroy回調
- 4. boost :: shared_ptr銷燬回調
- 5. Rspec的before_destroy回調
- 6. Terraform銷燬不執行。 「銷燬已取消」
- 7. Rails has_many使用關聯ID不會調用回調銷燬
- 8. 競爭條件銷燬回調
- 9. 點擊'取消'按鈕後銷燬$ _SESSION
- 10. 覆蓋創建和銷燬事件的Rails回調?
- 11. 登錄使用「before_destroy」回調
- 12. 調用backbone.js銷燬
- 13. Spring Custom Scoped Bean - 銷燬回調
- 14. 重寫銷燬但保留回調
- 15. Rails before_destroy回調數據庫變化總是回滾
- 16. rails polymorphic_url銷燬行動
- 17. 銷燬會話,Rails設計
- 18. Rails:無法銷燬關聯
- 19. Rails,銷燬與刪除?
- 20. Rails 3 public_activity,銷燬記錄
- 21. Rails銷燬嵌套條目。
- 22. Rails依賴銷燬錯誤
- 23. Rails雙重多態依賴:銷燬沒有正確銷燬
- 24. Rails無法在刪除前調用before_destroy
- 25. Rails devise before_destroy用戶
- 26. Rails 4:在before_destroy回調中訪問變量
- 27. 銷燬調用實例
- 28. 銷燬
- 29. Datamapper - 之前:銷燬回調被調用兩次?
- 30. 無法調用View#從被銷燬的回調中訂閱
使用Rails 5,返回false不再起作用。應該拋出(:中止)'以防止刪除記錄。看到[這個評論](http://stackoverflow.com/questions/123078/how-do-i-validate-on-destroy-in-rails#comment59333149_123190) – RFVoltolini
謝謝,我已經更新了我的答案,以幫助新人。 – Leito
感謝您指定:Rails 5的中止技術。應該真的幫助我。 – CanadaIT