Ruby on rails 不能';找不到带有';id'=参数[:id]
如果我没有带有Ruby on rails 不能';找不到带有';id'=参数[:id],ruby-on-rails,ruby,activerecord,rails-activerecord,Ruby On Rails,Ruby,Activerecord,Rails Activerecord,如果我没有带有id=params[:id]的行,我如何检查它,因为 当我写作时 def show @post=Post.find(params[:id]) if @post.nil? @post={ title:"No such post", post:"No such post" } end end 我收到错误。show控制器应仅显示现有元素。当元素(Post实例)不存在时,find抛出异常。正如@Micha
id=params[:id]
的行,我如何检查它,因为
当我写作时
def show
@post=Post.find(params[:id])
if @post.nil?
@post={
title:"No such post",
post:"No such post"
}
end
end
我收到错误。
show
控制器应仅显示现有元素。当元素(Post
实例)不存在时,find
抛出异常。正如@Michal在评论中所建议的那样,通常不存在的实体会通过404
response或类似方式进行处理
不过,就目前而言,您可能会通过以下方式欺骗Rails:
@post = Post.find(params[:id]) rescue {
title: "No such post",
post: "No such post"
}
这当然不是生产解决方案,但在学习阶段可能会有所帮助。来自:
查找(*args)
按id查找-可以是特定id(1)、id列表(1、5、6)或id数组([5、6、10])。如果找不到列出的所有ID的记录,则将引发RecordNotFound
因此,如果find
找不到任何具有您要查找的id
的内容,它将引发ActiveRecord::RecordNotFound
异常,而不是像您希望的那样返回nil
。该异常最终在Rails内部得到处理,并转换为404
您可以自己捕获该异常:
def show
@post = Post.find(params[:id])
rescue ActiveRecord::RecordNotFound
@post = {
title: "No such post",
post: "No such post"
}
end
请注意,您只会捕获您希望看到的特定异常,一个简单的救援几乎总是一个错误,因为它可以隐藏bug
您还可以使用:
查找依据(*args)
[…]
如果未找到记录,则返回nil
像这样:
def show
@post = Post.find_by(:id => params[:id])
if @post.nil?
@post = {
title: "No such post",
post: "No such post"
}
end
end
异常用于处理错误和其他异常情况,而不是用于正常的流量控制。对于这类事情,我可能会使用find_by
;您似乎期望偶尔出现丢失的记录,因此丢失的记录并非真正的错误或意外情况。您会遇到什么错误?代码在我看来没问题,这是故意的。您应该使用404.html或在控制器中处理缺少的页面。当找不到帖子时,为什么要显示特定页面?对我来说也是;但是我的@post=post.find(params[:id])有一个错误;所以我不能检查我的@post是假的还是真的我怎么能写我的404.html;我应该把它放在哪里;所以它就像其他语言中的“try{}except{}”语句;