我用Rails 2.3.5和,如果我給Model.find(1)
,如果1沒有在數據庫中,它返回ActiveRecord的錯誤。是否應該像Model.find_by_column('..')
那樣返回nil
?梁2:Model.find(1)給出的ActiveRecord錯誤時ID 1不存在
回答
這是預期的行爲。我認爲大衛自己解釋了這一點,所以這裏引用了Ruby,S.,Thomas,D。& Hansson,D.H.,2009。Agile Web Development with Rails,第三版第三版,Pragmatic Bookshelf(p.330)。
當您使用 主鍵驅動的取景器,你正在尋找一個 特定記錄。你期望它存在 。根據我們對人 表的知識,致Person.find(5)爲 。我們希望該行的ID爲 5.如果此呼叫不成功 - 如果ID爲5的記錄已被銷燬 - 我們處於例外 的情況。這要求提高 的一個例外,所以Rails提高了 RecordNotFound。
另一方面, 使用條件搜索 正在尋找匹配。所以, Person.find(:第一個, :conditions =>「name ='Dave'」)是 相當於告訴數據庫(如 一個黑匣子)「給我第一個人 有名字的行Dave「。這個 表現出明顯不同的 檢索方法;我們並不確定我們會得到結果。 結果集 可能爲空是完全可能的。因此,在該 搜索 一行和該搜索許多行發現者 空數組發現者的情況下返回nil是 自然,nonexceptional響應。
這也解釋了它最好的.. – rubyprince 2011-02-11 07:29:56
如果你想在例外中的查找方法find_by_attributes口味被拋出,則可以使用砰!該方法的版本。 例如, Model.find_by_category!(a_category_value) 將在未找到匹配項的情況下拋出RecordNotFound。 我發現這是DRY像REST風格的控制器,在這裏我對異常的常見錯誤處理程序,我想如果沒有找到匹配給定參數的資源我的行動,行爲一致的場景。 – 2013-04-30 01:59:25
關於這個混亂,重複和大家一起來到Rails的,並得到一個例外。令人困惑/驚訝的是因爲`find`是一個柔和的動詞,並沒有明確指出存在的精確性或預知性。當然,我們的決定現在揹負的,但它是一個將,只要新人們開始使用Rails的問了一個問題。 – ocodo 2013-11-07 02:08:55
拋出異常是預期的行爲。
其實在事件的正常過程中,如果你讓異常未處理去你的軌道服務器將返回正確的404頁沒有發現錯誤。
,如果你想讓它回到零,你可以自己抓住它:
begin
@model = Model.find(id_provided)
rescue ActiveRecord::RecordNotFound => e
@model = nil
end
Thanks..I也發現了錯誤,我發現它令人討厭......我們可以使用`Model.find_by_id(1)`,但我覺得它很笨拙。 – rubyprince 2011-02-11 07:25:18
您可以檢查記錄讀取它之前存在。
@model = Model.find(id) if Model.exists?(id)
如果你真的不想例外,您可以使用find_by_id
:
# @user = User.find(params[:id]) # original code
@user = User.find_by_id(params[:id])
if @user
# found!
else
# not found
end
這應該不是一個單獨的exists?
檢查速度更快。
編輯:注意,@Miguelgraz評論說,在軌道4,5則應該說User.find_by(id: params[:id])
。相同的功能,但現在實施將不需要0。
如果你想在例外中的查找方法find_by_attributes口味被拋出,則可以使用砰!該方法的版本。
例如,如果沒有找到匹配
Model.find_by_category!(a_category_value)
將拋出RecordNotFound。
我發現這是DRY像REST風格的控制器,在這裏我對異常的常見錯誤處理程序,我想如果沒有找到匹配給定參數的資源我的行動,行爲一致的場景。
軌道4方法
if user = User.find_by(id: params[:id])
#do something with user
else
#throw error or redirect
raise ActiveRecord::RecordNotFound
end
您可以使用find_by與所需的屬性(在你的情況下,ID),這將返回nil,而不是給一個錯誤,如果沒有找到指定的ID。
Model.find_by_id(id_value)
你也可以使用其中,但你要知道,在那裏與零個或多個記錄返回一個有效記錄的關係,你需要先用只返回一個記錄或爲零的情況下,零個記錄返回。
Model.where(id: id_value).first
您可以簡單地使用:
user = User.find(10) rescue nil
- 1. 在Javascript控制檯中給出1,{a:1,b:2}給出錯誤的{a:1}打字行爲是什麼?
- 2. 錯誤:索引2超出軸1的大小1的範圍
- 3. 錯誤的參數數目(2給出,預計0..1)
- 4. @ project.impressionist_count - 錯誤的參數數目(2給出,預計0..1)
- 5. Django的錯誤:__init__takes至少2個參數1給出
- 6. 的Python:類型錯誤:恰恰1個參數(2給出)
- 7. 有趣 '恰恰1個參數(2給出)' 的Python錯誤
- 8. Python2.7中的錯誤只需要2個參數(1給出)
- 9. 類型錯誤:()的方法恰恰1參數(2給出)
- 10. Django的錯誤:__init __()恰恰1個參數(2給出)
- 11. 的argv [1]給段錯誤
- 12. -1 * int.MinValue給出了一個錯誤
- 13. 爲什麼在Ruby中使用DBM時,db [1] = 2是可以的,但是打印db [1]會給出錯誤?
- 14. python錯誤︰方法需要剛好1參數(2給出)
- 15. 類型錯誤:read_excel()到底需要2個參數(1給出)
- 16. 庫MySQLi錯誤:addcslashes()預計2個參數,1給出
- 17. 「類型錯誤:_new_()需要至少2個參數(1給出)」
- 18. Python錯誤TypeError:__init __()只需要2個參數(1給出)
- 19. 類型錯誤:恰恰1個參數(2給出)內GAE
- 20. 類型錯誤:render_page()到底需要2個參數(1給出)
- 21. 錯誤 - __init __()只需要2個參數(1給出)
- 22. printf的「-1」在bash給出錯誤原因不明
- 23. 爲什麼1/0給出錯誤,但1/0.0返回「Inf」?
- 24. ASIHTTPREQUEST在iPhone鎖定和解鎖時給出錯誤(1)
- 25. SOX:安裝libmad make [1]:*** [all-recursive]錯誤1&make:*** [all]錯誤2
- 26. 錯誤的參數數目(0 1)用ActiveRecord ::保存
- 27. 資源ID#1錯誤在PHP
- 28. 錯誤:在(1)
- 29. IEnumerable的<string>給出結果與值[ 「1」, 「1」],它應該得到[ 「1」, 「2」]
- 30. ActiveRecord表不存在錯誤
對於軌道4回答,請參閱http://stackoverflow.com/a/26885027/645223 – Miguelgraz 2014-11-13 14:15:09