gpt4 book ai didi

ruby-on-rails - RoR - 不要破坏对象,只是标记为隐藏

转载 作者:行者123 更新时间:2023-12-01 01:26:08 25 4
gpt4 key购买 nike

我在 RoR 中有一个简单的模型,我想保留人们在网站上输入的所有内容。但是,如果用户单击“删除”,我也希望能够隐藏一些内容。

所以我在我的模型中添加了一个名为“displayed”的 bool 属性。

我想知道,最佳实践风格的方法是什么。

我想我必须用类似的东西改变 Controller :

def destroy
@point = Point.find(params[:id])
@point.displayed = false
@point.save

respond_to do |format|
format.html { redirect_to points_url }
format.json { head :no_content }
end

但我不确定它是否干净。最好的方法是什么。

正如你猜想的那样,我对 RoR 不屑一顾。代码块将不胜感激。

谢谢

最佳答案

自己实现它(而不是使用 gem)。它比一开始看起来要容易得多,而且它也没有任何 gem 那么复杂 更改 destroy 的含义方法,在我看来,这是一个坏主意。

我并不是说使用 gem 本身很复杂——我是说通过改变 destroy 的含义来实现。方法你正在改变人们在 Rails 世界中认为理所当然的东西的含义 - 当你调用 destroy 时那个记录将会消失,那个destroy如果它们通过 dependent: destroy 链接在一起,也可以在依赖对象上调用回调。

更改 destroy 的含义也很糟糕,因为在“约定优于配置”的世界中,当您违反约定时,您实际上是在破坏 Rails 代码的“自动性”。所有这些你认为理所当然的东西,因为你阅读了一段 Rails 代码,并且你知道某些假设通常适用——那些已经过时了。当您以不明显的方式更改这些假设时,您几乎肯定会因此而引入一个错误。

不要误会我的意思,没有什么比实际阅读代码来检查您的假设更好的了,但作为一个社区,能够谈论某些事情并通常让他们的行为以某种方式行事也很好。

考虑以下:

  • 在 Rails 中没有说你必须实现 destroy Controller 中的操作,所以不要。这是标准操作之一,但不是必需的。
  • 使用 update设置和清除 archived 的操作 bool 属性(或类似名称)
  • 我用过acts_as_paranoid gem,如果您需要在模型中添加任何范围(除了 gem 提供的范围),您将发现自己不得不绕过它,关闭默认的“隐藏存档记录”范围,以及何时你会遇到它几乎立即失去它的值(value)。此外,该 gem 本身几乎什么都不做,而且它的功能可以很容易地自己编写(我的意思是只比安装 gem 本身做更多的工作),所以从这个角度来看使用它真的没有任何好处。
  • 如前所述,覆盖 destroy方法或 Action 是个坏主意,因为它违反了 Rails(和 ActiveRecord)关于调用 destroy 的含义的约定。在一个物体上。任何这样做的 gem(例如 acts_as_paranoid)也违反了这个约定,你最终会混淆自己或其他人,因为 destroy根本不会意味着它应该意味着什么。这会给您的代码增加困惑,而不是清晰。不要这样做——你以后会付钱的。
  • 如果您想使用软删除 gem,因为您要防止一些理论上的、 future 的开发人员可能会占用您的数据……那么,最好的解决方案是不要雇用这些人或与这些人一起工作。没有经验的人需要指导,而不是防止他们犯错的 gem 。
  • 如果你真的,绝对,必须防止破坏给定模型的记录(除了能够简单地归档它),那么使用 before_destroy回调并简单地返回 false,这将防止它被销毁,除非显式调用 delete被使用(无论如何都与破坏不同)。此外,回调到位使得它 (a) 非常明显为什么 destroy不改变其含义就无法工作,并且(b)很容易编写测试以确保它不可破坏。这意味着将来,如果您不小心删除了该回调或执行了其他使该模型可销毁的操作,那么测试将失败,并提醒您注意这种情况。
  • 关于ruby-on-rails - RoR - 不要破坏对象,只是标记为隐藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14718733/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com