2013-04-25 51 views
1

更新:閱讀的答案後,我覺得我應該改一下我的問題(如問題3)在Cancan中編寫規則或模型驗證?

不時我感到困惑的地方,我應該寫一些有條件的檢查:在慘慘能力或在ActiveRecord模型驗證?

作爲第一個例子:說我有一個可以嵌套的文件夾模型。如果它是父文件夾的唯一子項,我想防止刪除它。

這應該可能是模型邏輯(作爲before_destroy回調)。不過,我也想隱藏刪除按鈕(和塊控制器操作),這看起來像康康的領域。

作爲第二個例子:我想防止刪除不屬於我的文件夾。

這將需要使用存儲在會話中的current_user。我的印象是會話相關條件不應該觸及模型本身,所以這是針對康康的。這是對的嗎?


問題3:

如果刪除文件夾既需要:

  1. CURRENT_USER是所有者檢查(寫爲慘慘能力)
  2. 文件夾是不是唯一的孩子檢查(寫在型號爲destroyable?()

Cancan能力還應該叫model.destroyable?(),還是我應該分別撥打model.destroyable?()(在視圖和控制器中)?

回答

3

IMO康肯約授權:用戶是否允許根據他們是誰刪除給定的資源。根據其他標準限制資源刪除超出該範圍。

這聽起來像是授權和業務邏輯的結合。視圖助手可能會檢查用戶can?是否刪除資源,並且該資源是否爲deletable?

1

對於第一個例子,我會這樣做:放一個before_destroy回調來防止破壞最後一個記錄,並且還會顯示基於CanCan能力的按鈕。只需隱藏該按鈕不會阻止將POST請求發送到您的服務器並刪除該記錄。

對於第二種情況,將CanCan檢查放在控制器操作上,以便在未授權的情況下不能調用destroy操作。它不屬於模型。

+1

+1明確提及服務器端認證檢查仍然是必需的,儘管cancan(ahem)可以使其基本不可見。它們都是一樣的(重新混合)認證邏輯。 – 2013-04-25 02:44:08

+0

因此對於我編輯的新的第三個問題,你會在cancan能力中調用model.destroyable?()嗎? – lulalala 2013-04-26 01:41:43