2015-09-20 26 views
-1

如果我沒有一行id=params[:id]我怎麼能檢查它,因爲 當我寫無法與「ID」 =參數發現後

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

我得到的錯誤。

+0

你會得到什麼錯誤?代碼對我來說看起來不錯。 – mudasobwa

+0

這是故意的。您應該使用404.html或在控制器中處理丟失的頁面。爲什麼你要顯示一個特定的頁面時,發現沒有發佈? –

+0

對我來說也是如此;但是我的@ post = Post發生錯誤。find(params [:id]);所以我不能檢查是我的@post false或true –

回答

1

show控制器預計只顯示現有元素。當元素(Post實例)不存在時,find將引發異常。正如@Michal在評論中建議的那樣,通常不存在的實體正在使用404響應或類似的方式處理。

其時,正,不過,你可能會欺騙和Rails:

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

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

+0

謝謝;所以它就像「try {} except { 「其他語言的陳述; –

2

fine manual

發現(*參數)

查找ID - 這可以是一個特定的ID(1),IDS(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(*參數)
[...]
如果沒有找到記錄,返回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這種事情;看起來你期望有偶然的失蹤記錄,所以它缺少的記錄並不是真正的錯誤或意外情況。