2013-05-07 66 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 
相關問題