2011-02-11 45 views

回答

51

這是預期的行爲。我認爲大衛自己解釋了這一點,所以這裏引用了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響應。

+0

這也解釋了它最好的.. – rubyprince 2011-02-11 07:29:56

+1

如果你想在例外中的查找方法find_by_attributes口味被拋出,則可以使用砰!該方法的版本。 例如, Model.find_by_category!(a_category_value) 將在未找到匹配項的情況下拋出RecordNotFound。 我發現這是DRY像REST風格的控制器,在這裏我對異常的常見錯誤處理程序,我想如果沒有找到匹配給定參數的資源我的行動,行爲一致的場景。 – 2013-04-30 01:59:25

+6

關於這個混亂,重複和大家一起來到Rails的,並得到一個例外。令人困惑/驚訝的是因爲`find`是一個柔和的動詞,並沒有明確指出存在的精確性或預知性。當然,我們的決定現在揹負的,但它是一個將,只要新人們開始使用Rails的問了一個問題。 – ocodo 2013-11-07 02:08:55

4

拋出異常是預期的行爲。

其實在事件的正常過程中,如果你讓異常未處理去你的軌道服務器將返回正確的404頁沒有發現錯誤。

,如果你想讓它回到零,你可以自己抓住它:

begin 
    @model = Model.find(id_provided) 
rescue ActiveRecord::RecordNotFound => e 
    @model = nil 
end 
+1

Thanks..I也發現了錯誤,我發現它令人討厭......我們可以使用`Model.find_by_id(1)`,但我覺得它很笨拙。 – rubyprince 2011-02-11 07:25:18

0

您可以檢查記錄讀取它之前存在。

@model = Model.find(id) if Model.exists?(id) 
22

如果你真的不想例外,您可以使用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​​。

1

如果你想在例外中的查找方法find_by_attributes口味被拋出,則可以使用砰!該方法的版本。

例如,如果沒有找到匹配

Model.find_by_category!(a_category_value) 

將拋出RecordNotFound。

我發現這是DRY像REST風格的控制器,在這裏我對異常的常見錯誤處理程序,我想如果沒有找到匹配給定參數的資源我的行動,行爲一致的場景。

0

軌道4方法

if user = User.find_by(id: params[:id]) 
    #do something with user 
else 
    #throw error or redirect 
    raise ActiveRecord::RecordNotFound 
end 
0

您可以使用find_by與所需的屬性(在你的情況下,ID),這將返回nil,而不是給一個錯誤,如果沒有找到指定的ID。

Model.find_by_id(id_value) 

你也可以使用其中,但你要知道,在那裏與零個或多個記錄返回一個有效記錄的關係,你需要先用只返回一個記錄或爲零的情況下,零個記錄返回。

Model.where(id: id_value).first 
0

您可以簡單地使用:

user = User.find(10) rescue nil 
相關問題