2013-05-07 65 views
3

在轨控制台,我这样做:为什么我不能在Ruby中销毁这个变量?

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 

对象从数据库中删除,但该变量仍然存在,仍然试图指向它。这是怎么回事?

+0

这会刷新所有变量,包括'input',但不会解决这个问题发生的原因以及是否应该这样。 – 2013-05-07 11:59:42

回答

1

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

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

可以使用input.delete

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