2011-02-22 55 views
2

我想寫一個方法,應該像任何Rails默認控制器中的destroy方法一樣工作,但不應該真正刪除數據。相反,它應該設置一個標誌或一些我可以在我的視圖中評估以不再顯示這些數據的東西。如何在Ruby on Rails中編寫mark_as_deleted方法?

所以當用戶點擊'刪除'時,相應的操作應該將數據標記爲已刪除但不能從數據庫中清除數據。

寫這種方法最優雅的方式是什麼?我正在使用Rails 3.

回答

5

如果您只想顯示或隱藏數據,我會在數據庫中有一個布爾值is_visible字段。

此外,不是在您的視圖中評估是否顯示此數據,而是將該邏輯放入模型中,位於default_scope(在rails 3中提供)中。因此,像這樣(假設你想顯示/隱藏Articles)...

# model 
class Article < ActiveRecord::Base 
    default_scope where(:is_visible => true) 
end 

顯然,你的刪除方法應該只設置is_visible布爾值false和創造它應該默認爲true

然後你只需要小心,如果你的數據與其他數據有關係。在這個例子中,如果你有Articles,他們有Comments,那麼如果Article被標記爲不可見,也許你不希望Comments出現在任何地方。

+0

範圍必須在模型中,而不是在控制器中。但它的工作原理完全如此:-)。謝謝。 – 2011-02-24 11:41:25

3

在我的一些應用程序中,我添加了一個名爲status的內容類型的列,它可以是「發佈」,「草稿」或「刪除」。這樣,用戶可以製作草稿或刪除發佈的項目,而不會搞亂索引視圖。

只要優雅,它可能不是最好的,但我只是在內容類型上創建一個new_draft方法,它創建一個status設置爲「草稿」的新對象。然後,當用戶發佈他們的草稿時,我會調用post方法,將status設置爲「發佈」。一旦發佈,如果用戶移除他們的物品,我會調用remove方法(您猜對了!)將status設置爲「移除」。