为什么我不能在Ruby中销毁这个变量?

时间:2013-05-07 11:50:39

标签: ruby-on-rails ruby

在rails控制台中,我这样做:

input = Input.create :name => "foo"
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
Input.all
=> [#<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">]
input
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
input.destroy
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
> Input.all
=> []
> input
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">
> input.reload
ActiveRecord::RecordNotFound: Couldn't find Input with id=8
> input
=> #<Input id: 8, name: "foo", created_at: "2013-05-07 11:45:17", updated_at: "2013-05-07 11:45:17">

我真正希望看到的是:

> input
=> nil

该对象已从数据库中删除,但该变量仍然存在,并且仍在尝试指向它。发生了什么事?

2 个答案:

答案 0 :(得分:3)

input变量在内存中存储对实例的引用。销毁记录将从数据库中删除该行。调用input.reloaddocs)会在尝试查找记录时引发异常,但不会代表您将变量的值设置为nil

此行为在DELETE请求的范围内非常有用,在该请求中,您希望显示有关所删除对象的信息。例如:

class WidgetsController < ApplicationController
  def destroy
    @widget = Widget.find(params[:id])
    @widget.destroy
    respond_with @widget, notice: "You successfully removed #{@widget.name}"
  end
end  

答案 1 :(得分:1)

destroy方法对数据库进行SQL调用,并销毁包含它的表中的行。它仍然允许你操作应用程序中的对象,只要它仍在范围内(即)回调和 即使在销毁对象后也允许使用过滤器。

如果我们不希望触发回调或者我们想要更好的性能,最好使用“删除”

您可以使用input.delete