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

hig*_*dth 8 ruby activerecord ruby-on-rails destroy ruby-on-rails-3.1

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

if @widget_part.destroy
  flash[:message] = "Error deleting widget part"
else
  flash[:message] = "Widget part destroyed successfully"
end
Run Code Online (Sandbox Code Playgroud)

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

flash[:message] = "Error deleting widget part : #{@widget_part.errors.inspect}"
Run Code Online (Sandbox Code Playgroud)

并且没有错误消息所以我很困惑.它给出了类似的东西

#<ActiveModel::Errors:0x00000103e118e8 @base=#<WidgetPart widget_id: 7, ..., 
  id: 67>, @messages={}>
Run Code Online (Sandbox Code Playgroud)

she*_*run 6

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

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


Tru*_* Lê 5

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

@widget_part.destroy

if @widget_part.destroyed?
  flash[:success] = 'The part is destroyed'
else
  flash[:error] = 'Failed to destroy'
end
Run Code Online (Sandbox Code Playgroud)