2011-03-24 65 views
13

我想製作一個系統,用戶只能看到他或她寫的文章。如果在rails中找不到任何東西,我該如何跳過一個錯誤?

在文章控制器,我把下面線

@article = current_user.articles.find(params[:id]) 

其中PARAMS [:ID]是article_id的。

我只想知道如何從顯示中跳過錯誤並重定向到:index操作,如果文章不存在,或者用戶沒有權限查看它。 我把@ article.nil?在上面的find語句之後的條件語句,但似乎上面的find語句立即產生如下的錯誤。

找不到文章與ID = 1662 [WHERE(articles .user_id = 1)]

我怎樣才能解決這個問題呢?

+0

相關[這個問題](http://stackoverflow.com/questions/4966430/model-find1-gives-activerecord-error-when -id-1-does-exist) – rubyprince 2011-03-24 03:07:49

回答

21

ActiveRecord :: Base.find如果找不到記錄,則始終引發異常,這是故意的。你應該只使用find,如果你絕對期望擁有你正在尋找的任何東西。如果您正在顯示一個show action並找不到該文章,則應該搶救該異常並呈現404(未找到),而不是重定向到索引(技術上)。

如果您想通過它的id屬性查找某個屬性而不強制執行異常,請使用動態查找程序find_by_id,如果它未找到具有該ID的記錄,將返回false。

編輯:

動態發現者現在有一個不同的簽名,find_by_id現在應該是:

find_by :id, id_to_find

看到新Rails Guide on Querying

+0

我會建議使用'find_by'而不是 – Anton 2015-11-25 23:40:43

+0

當查詢這個問題時'find_by'不存在。雖然我確實添加了指南和動態查找器部分的鏈接。 – 2016-02-11 16:28:17

1

的find()方法提出了一個RecordNotFound異常,而諸如find_by_id的方法將返回一個零值。所以,你有你可以用一個開始/救援包裝您的方法調用中的一對夫婦的選擇,一個rescue_from塊添加到您的控制器:

rescue_from(ActiveRecord::RecordNotFound) {|e| do something here } 

或使用find_by_id方法和處理情況返回零的條件。

實際上有很多其他的選擇,但上面的選擇是一個好的開始,find_by_id可能是最簡單的。

2

這是因爲ActiveRecord find方法在找不到特定ID時引發異常。你可以解決這個一對夫婦的方式,最好的辦法似乎是

begin 
    @article = current_user.articles.find(params[:id]) 
rescue 
    redirect_to articles_path 
end 
相關問題