10

我正在维护某人的代码库,他们有这样的东西:

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={}>
4

4 回答 4

6

如果不确定,可以使用destroyed?方法。destroy 的返回值没有记录,但它只返回冻结的销毁对象(您无法更新它)。它不返回销毁操作的状态。

虽然通常销毁对象应该总是成功,但您可以监听ActiveRecordError。例如,乐观锁定可以在记录销毁时引发 ActiveRecord::StaleObjectError。

于 2012-09-28T20:14:35.640 回答
5

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

@widget_part.destroy

if @widget_part.destroyed?
  flash[:success] = 'The part is destroyed'
else
  flash[:error] = 'Failed to destroy'
end
于 2014-01-02T05:10:16.673 回答
1

根据Ruby on Rails API 文档,该destroy方法将返回您销毁的对象,但处于冻结状态。

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

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

于 2012-09-28T20:15:43.307 回答
0

请注意,虽然在 OP 的情况下有效,但它仅在与or#destroyed?相同的模型实例上调用时才有效;它不会检查数据库以查看基础记录是否已通过其他实例删除。#destroy#delete

item1 = Item.take
# => #<Item:0x00000001322ed3c0

item2 = Item.find(item1.id)
# => #<Item:0x00000001116b92b8

item1.destroy
# => #<Item:0x00000001322ed3c0

item1.destroyed?
# => true

item2.destroyed?
# => false

item2.reload
# => raises ActiveRecord::RecordNotFound

如果您需要检查另一个进程是否从您下面删除了记录(例如,由另一个用户,或者在通过控制器操作删除记录的测试中),您需要调用#exists?模型类。

Item.exists?(item2.id)
# => false
于 2022-02-03T20:25:26.350 回答