gpt4 book ai didi

ruby-on-rails - 在 Rails 中使模型不可删除

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:41 25 4
gpt4 key购买 nike

确保没有人可以通过控制台或尝试调用 model.destroy 的 Controller 删除 Rails 中的模型记录的正确方法是什么?或者甚至通过尝试销毁一个在与此不可删除模型的关系上设置了 dependent::destroy 的对象。

这应该永远行不通:

User.first.destroy

我绝不希望某些模型在任何情况下都丢失(当然,除了直接访问数据库或更改 Ruby 代码之外)。

最佳答案

IMO 你应该分配一个引发错误的 before_destroy 回调。

class Model < ActiveRecord::Base
before_destroy :nope

private

def nope
raise "nope!" if (id == 1)
end
end

如果引发错误是 Not Acceptable (以防它停止其他操作),您必须定义自己的destroy:

class Model < ActiveRecord::Base
def destroy
super if should_destroy?
end

def should_destroy?
id != 1
end
end

before_destroy 也会拦截destroy_all

但以下将有助于更明确地拦截 destroy_all:

class Model < ActiveRecord::Base
class ActiveRecord_Relation
def destroy_all
where(id: 1).exists? ? raise("nope!") : super
end
end
end

Model.where(id: 1).destroy_all #=> nope! (nothing gets destroyed)
Model.where(id: [1, 2]).destroy_all #=> nope! (nothing gets destroyed)
Model.where(id: 2).destroy_all #=> destruction!!! carnage! HAVOC!

以及无错误的实现:

class Model < ActiveRecord::Base
class ActiveRecord_Relation
def destroy_all
err_id = 1
return super unless where(id: err_id).exists?

ids = pluck(:id) - [err_id]
where(id: ids).destroy_all
end
end
end

关于ruby-on-rails - 在 Rails 中使模型不可删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29118973/

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