2

我經歷邁克爾·哈特爾的Rails的教程,特別是第6章:邁克爾·哈特爾的Rails的教程:User.find(1)銷燬方法之後顯示堆棧跟蹤

http://ruby.railstutorial.org/chapters/modeling-and-viewing-users-one#sec:finding_user_objects

後,我做了User.find (1)user.destroy命令後,我得到了以下錯誤消息:

ruby-1.9.2-p290 :006 > User.find(1) 
ActiveRecord::RecordNotFound: Couldn't find User with ID=1 
    from /Users/me/.rvm/gems/[email protected]/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:304:in `find_one' 
    from /Users/me/.rvm/gems/[email protected]/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:289:in `find_with_ids' 
    from /Users/me/.rvm/gems/[email protected]/gems/activerecord-3.0.9/lib/active_record/relation/finder_methods.rb:107:in `find' 
    from /Users/me/.rvm/gems/[email protected]/gems/activerecord-3.0.9/lib/active_record/base.rb:444:in `find' 
    from (irb):6 
    from /Users/me/.rvm/gems/[email protected]/gems/railties-3.0.9/lib/rails/commands/console.rb:44:in `start' 
    from /Users/me/.rvm/gems/[email protected]/gems/railties-3.0.9/lib/rails/commands/console.rb:8:in `start' 
    from /Users/me/.rvm/gems/[email protected]/gems/railties-3.0.9/lib/rails/commands.rb:23:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>' 

我一般是新的節目,我不知道從哪裏着手。用谷歌搜索錯誤信息沒有任何用處。一切看起來都很好,我只是不知道爲什麼我會在例外情況下得到錯誤信息。

回答

1

如果你

User.first(:conditions => { :id => 1 }) 

爲什麼你的例外是Rails的假設,如果你使用的查找(ID)的方法,你想到的是存在這樣的對象的原因,你不會得到例外。如果沒有給定id的對象,則將其視爲錯誤並引發異常。另一方面如果你使用.first方法,並且你寫條件,你不會告訴rails你期望這個對象存在 - 它可能但可能不會,所以在這種情況下,沒有例外。 這是一個有點棘手:)希望它有點清楚,爲什麼你在你的情況下得到例外,而不是我寫的。解釋你的期望很簡單。

+0

啊好吧,我假設堆棧跟蹤的是「預期的行爲?」 – dartfrog

+0

是,正好:) – mkk

+3

或'find_by_id',它是上面的一個較短版本。 –

0

find導致失敗時出現錯誤,而find_by_<attribute here>方法僅返回nil。所以在這種情況下,您可以使用find_by_id,它將返回nil而不是堆棧跟蹤。

0

您還可以捕獲異常,並在找不到記錄時執行其他操作。就像這樣:

begin 
    @user = User.find(id) 
    respond_with @user 
rescue ActiveRecord::RecordNotFound 
    flash[:alert] = "User with id = #{id} not found" 
    redirect_to users_path 
end 
2

由於您是編程新手,所以關鍵的一點是仔細查看錯誤消息。

不幸的是,有時候這些錯誤信息有點含糊不清,而且我個人發現我經常需要讀兩遍,特別是如果它是一種您正在嘗試學習的新編程語言。

現在解構錯誤的序列。

在這種情況下,錯誤表明你沒有記錄,因爲每個消息:

ActiveRecord::RecordNotFound: Couldn't find User with ID=1 

的錯誤導致,因爲你想找到的1.原有的操作ID的用戶是:

User.find(1) 

其中,根據您的評論進行了'Destroy'操作,從而刪除數據。那當然假設你有一條記錄,或者要求銷燬這條記錄。當然,正如其他人所說,找到操作拋出

的API在Rails API記錄和你想要的是找到方法的細節描述的異常:

如果可以爲所有沒有找到記錄列出的ID,然後RecordNotFound將被提出。

另一個很好的參考是API Dock

相關問題