我决定更改应用程序上的销毁功能,只需将状态字段切换为false(索引和显示操作仅显示状态结果为true)。
嗯,我已经改变了这一点,它最初起作用了,但现在只是"回滚"在完成提交之前......
控制器破坏:
def destroy
@customer = Customer.find(params[:id])
@contact = @customer.contacts
@adress = @customer.adresses
if @customer.delete(current_user)
@contact.each do |f|
f.delete(current_user)
end
@adress.each do |g|
@telephone = g.telephones
@telephone.each do |t|
t.delete(current_user)
end
g.delete(current_user)
end
flash[:success] = "Cliente excluído"
else
flash[:danger] = "Erro! O cliente não foi excluído."
end
redirect_to customers_path
end
模型删除:
def delete(user_id)
update_attributes(status: false, changed_by: user_id, deleted_at: Time.now, updated_at: Time.now)
end
除此之外我将:destroy方法仅限制为Admin(这是正确的方法吗?为什么不删除?)
谢谢!
答案 0 :(得分:0)
您回滚的问题可能与验证失败有关。您可以通过将update_attributes
更改为update_attributes!
来了解这是什么。当验证失败并且您可以看到出现问题时,这会抛出错误。
除此之外,还有一些方法可以改进您的代码
首先,不是手动删除客户的联系人和地址,而是可以将依赖::: destroy添加到关系中。
这样工作原理如下:
class Customer < ActiveRecord::Base
has_many :contacts, dependent: :destroy
has_many :adresses, dependent: :destroy
end
class Adress < ActiveRecord::Base
has_many :telephones, dependent: :destroy
end
当你在记录上调用.destroy
时,它将在任何具有依赖关系的关系上调用.destroy
:对它们进行销毁。 .delete
不会通过,这是它们之间的主要区别。
通过将其添加到上述关系中,您可以将控制器更改为:
def destroy
@customer = Customer.find(params[:id])
if @customer.destroy
flash[:success] = "Cliente excluído"
else
flash[:danger] = "Erro! O cliente não foi excluído."
end
redirect_to customers_path
end
这将破坏客户,地址和地址的电话。
要像你想要的那样进行软删除,你应该使用Paranoia gem。
它允许您为acts_as_paranoid
分配一个类,因此当您致电.delete
或.destroy
时,它并未真正删除,它只是隐藏,可以在以后恢复。
它与Activerecord完美集成,因此您无需执行Customer.where(status: true)
之类的操作来获取未删除的记录,默认情况下它不会包含已删除的记录。虽然您可以在需要时提出要求。
gem的Github页面非常好地解释了如何使用它。
默认情况下,它不会保存执行删除的用户,只会保存执行删除的时间。如果你想这样做,你应该创建一个在分配执行删除的用户后调用delete的包装器。
这样的事情应该有效:
def destroy_by(user)
update_attributes!(changed_by: user)
destroy
end
然后,您可以将控制器中的@customer.destroy
更改为@customer.destroy_by(current_user)
无需覆盖或限制删除或销毁。