2011-07-25 20 views
6

在我的編輯操作處理的ActiveRecord :: RecordNotFound在Ruby中,我有on Rails的

@item = current_user.shop.items.find(params[:id]) 

讓屬於自己的店鋪,用戶只能編輯項目。如果他們試圖編輯不屬於他們商店的商品,那麼他們會得到一個ActiveRecord :: RecordNotFound錯誤。

在這種情況下處理此錯誤的最佳方法是什麼?我應該舉個例外嗎?我應該重定向某處並設置閃光燈(如果是這樣,我該怎麼做),我應該保持原樣嗎?任何建議表示讚賞。對於@Koraktor的解決方案

rescue_from ActiveRecord::RecordNotFound do 
    flash[:notice] = 'The object you tried to access does not exist' 
    render :not_found # or e.g. redirect_to :action => :index 
end 

回答

20

添加類似以下到您的控制器。如果你想避免ActiveRecord :: RecordNotFound,你可以使用find_by方法而不是find。

@item = current_user.shop.items.find_by_id(params[:id]) 
if @item.nil? 
    flash[:error] = "Item not found" 
else 
    # Process the @item... 
end 
+0

真棒回答,謝謝幫助我很多。 – SSR

19

+1:

感謝

4

此外,您應該設置HTTP狀態而呈現模板:

rescue_from ActiveRecord::RecordNotFound do 
    render :not_found, :status => :not_found 
end 

檢查Rails guide的狀態列表(第2.2.13.4)。

如其他地方所述(例如here),發送40x狀態時不應重定向,只有30x狀態應允許重定向。因此,只要嘗試使用:not_found狀態進行重定向,您可能會遇到一個奇怪的「您正在重定向」頁面。