使用.destroy()返回值检查ActiveRecord对象是否被销毁

时间:2012-09-28 20:02:02

标签: ruby-on-rails ruby activerecord ruby-on-rails-3.1 destroy

我维护某人的代码库,他们有类似的东西:

if @widget_part.destroy
  flash[:message] = "Error deleting widget part"
else
  flash[:message] = "Widget part destroyed successfully"
end

destroy返回什么?可以这样测试吗?我问的原因是我试图使用

flash[:message] = "Error deleting widget part : #{@widget_part.errors.inspect}"

并且没有错误消息,所以我很困惑。它给出了像

这样的东西
#<ActiveModel::Errors:0x00000103e118e8 @base=#<WidgetPart widget_id: 7, ..., 
  id: 67>, @messages={}>

3 个答案:

答案 0 :(得分:5)

如果您不确定,可以使用destroyed?方法。 destroy的返回值是未记录的,但它只返回冻结的被破坏对象(你不能更新它)。它不会返回销毁行为的状态。

虽然通常会破坏对象应始终成功,但您可以听取ActiveRecordError。例如,Optimistic Locking可以在记录销毁时引发ActiveRecord :: StaleObjectError。

答案 1 :(得分:3)

正如上面提到的那些人,destroy没有返回布尔值,而是返回一个冻结对象。此外,它还会更新您调用它的实例对象的状态。以下是我编写控制器的方法:

@widget_part.destroy

if @widget_part.destroyed?
  flash[:success] = 'The part is destroyed'
else
  flash[:error] = 'Failed to destroy'
end

答案 2 :(得分:1)

根据Ruby on Rails API documentationdestroy方法将返回您销毁但仍处于冻结状态的对象。

当一个对象被冻结时,不应该对该对象进行任何更改,因为它不能再被持久化。

您可以使用object.destroyed?检查对象是否已被销毁。