我想编写一个方法,它应该像任何Rails默认控制器中的destroy方法一样工作,但不应该真正删除数据。相反,它应该设置一个标志或我可以在我的视图中评估的东西,以便不再显示这些数据。
因此,当用户点击“删除”时,相应的操作应将数据标记为已删除,但不会清除数据库中的数据。
编写这种方法最优雅的方法是什么?我正在使用Rails 3。
答案 0 :(得分: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
,那么如果将Comments
标记为不可见,则您可能不希望Article
出现在任何位置。
答案 1 :(得分:3)
在我的一些应用中,我在名为status
的内容类型中添加了一列,可以是“已发布”,“草稿”或“已删除”。这样,用户可以制作草稿或删除已发布的项目,而不会弄乱索引视图。
就优雅而言,它可能不是最好的,但我只是在内容类型上创建new_draft
方法,这会创建一个status
设置为“草稿”的新对象。然后,当用户发布他们的草稿时,我会调用post
方法将status
设置为“已发布”。发布后,如果用户移除了他们的商品,我会调用remove
方法(您猜对了!)将status
设置为“已移除”。