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{}”语句;