[英]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.