Rails2中的詭異(1)

2021-08-29 21:44:25 字數 1021 閱讀 6290

應用場景:

圖書分類和圖書,一對多關係。

我想實現當分類中還有所屬圖書,就不能讓使用者刪除分類。

我是這樣做的:

model中

class categroyhasbook***ception < runtimeerror;end

class bookcategory < activerecord::base

has_many :books, :dependent => :nullify

before_destroy :if_still_has_books

def if_still_has_books

raise categroyhasbook***ception unless self.books.blank?

end

控制器中

# 刪除圖書分類

def destroy

@book_category = bookcategory.find(params[:id])

@book_category.destroy

rescue categroyhasbook***ception

flash[:warn] = "圖書分類[#]中還有圖書,你不能刪除此分類"

else

flash[:notice] = "圖書分類[#]已刪除"

ensure

redirect_to :action => 'index'

end

上面的**和邏輯從表面上,是沒有問題的,還是現實是:圖書分類中有圖書存在,分類還是可以刪除,在if_still_has_books方法中self.books.blank?始終為true。

我左找右找上找下找,原來是has_many :books, :dependent => :nullify中的:dependent => :nullify引來了詭異,去掉:dependent => :nullify,世界又變得美好了。

Rails2的部分新特性

大多數常見的異常都可以統一處理,而不是每個需要單獨的處理。通常情況下,你只需要覆蓋rescue action in public方法,來進行統一的異常處理即可。但是你也有可能需要使用自己的case語句來處理特定場合的異常。因此我們現在提供了乙個類級別的巨集叫做rescue from,你可以使用它來宣...

Rails2的部分新特性

大多數常見的異常都可以統一處理,而不是每個需要單獨的處理。通常情況下,你只需要覆蓋rescue action in public方法,來進行統一的異常處理即可。但是你也有可能需要使用自己的case語句來處理特定場合的異常。因此我們現在提供了乙個類級別的巨集叫做rescue from,你可以使用它來宣...

Rails2的部分新特性

大多數常見的異常都可以統一處理,而不是每個需要單獨的處理。通常情況下,你只需要覆蓋rescue action in public方法,來進行統一的異常處理即可。但是你也有可能需要使用自己的case語句來處理特定場合的異常。因此我們現在提供了乙個類級別的巨集叫做rescue from,你可以使用它來宣...