销毁和删除功能Rails的问题



我决定更改应用程序上的destroy函数,将Status字段切换为false(索引和显示操作只显示Status为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(这是正确的方法吗?为什么它不删除?)

谢谢!

您的回滚问题可能与验证失败有关。您可以通过将update_attributes更改为update_attributes!来了解这是什么。当验证失败时,这将引发错误,您可以看到出了什么问题。

除此之外,还有一些方法可以改进您的代码

首先,您可以将dependent::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的任何关系调用.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宝石。它允许您用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)

不需要覆盖或限制删除或销毁。

最新更新