2011-02-11 79 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 
相关问题