我用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