簡體   English   中英

找不到帶有'id'= params [:id]的帖子

[英]Couldn't find Post with 'id'=params[:id]

如果我沒有id=params[:id]行,那該怎么辦?

def show
    @post=Post.find(params[:id])
    if @post.nil?
       @post={
        title:"No such post",
        post:"No such post"
       }
    end
end

我出錯了。

精美的手冊中

查找(* 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

請注意,您只會捕獲您期望看到的特定異常,僅僅進行rescue幾乎總是一個錯誤,因為它可以隱藏錯誤。

您還可以使用find_by

find_by(* 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這樣的東西; 似乎您期望偶爾會丟失記錄,因此丟失記錄並不是真正的錯誤或意外情況。

show controller應該僅顯示現有元素。 當元素( Post實例)不存在時, find引發異常。 正如@Michal在評論中建議的那樣,通常不存在的實體正在使用404響應等進行處理。

但是,暫時,您可能會欺騙Rails:

@post = Post.find(params[:id]) rescue { 
    title: "No such post",
    post: "No such post"
  }

當然,這不是生產解決方案,但在學習階段可能會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM