2016-04-16 27 views
0

在我的控制器我有我的行動的一個驗證碼:Rails的通用未找到控制器方法

begin 
    @user = User.find(params[:id]) 
    @user.destroy 
rescue ActiveRecord::RecordNotFound 
    render :json => {"status" => "404", "message" => "User with id #{params[:id]} not found"} 
    return 
end 

而且工作正常,但我不想複製粘貼到所有需要運行的方法一個Select查詢。

於是我找到這個答案How to redirect to a 404 in Rails?

,然後試圖略有不同,因爲我渲染JSON API端點,而不是模板。 請注意,我不知道是否會在那裏定義params [:id]。

def not_found 
    render :json => {"status" => "404", "message" => "User with id #{params[:id]} not found"} 
    end 

反正我修改查詢用:

@user = User.find(params[:id]) or not_found 

但仍是提高的ActiveRecord :: RecordNotFound例外。

也有可能創建一個通用的not_found動作,我可以在所有的控制器中使用它,我可以通過它的ID參數和對象的類型?

像一些通用的404,500,400,200層的方法,其渲染JSON響應,我可以只傳遞一些參數在你的ApplicationController

回答

2

使用rescue_from:

class ApplicationController 
    rescue_from ActiveRecord::RecordNotFound, with: :show_not_found_errors 

    # All the information about the exception is in the parameter: exception 
    def show_not_found_errors(exception) 
     render json: {error: exception.message}, status: :not_found 
    end 
end 

因此,任何的ActiveRecord :: RecordNotFound將通過show_not_found_errors方法獲救。在ApplicationController中添加這些代碼,它將適用於從ApplicationController繼承的所有其他控制器。

+0

感謝您的回覆!有了你的代碼,我現在收到一個空的JSON時沒有找到對象,我應該用我的代碼替換渲染json:exception,status :: not_found嗎? – lapinkoira

+0

當然,我的代碼只是一個例子。 –

+0

我明白了,有沒有辦法將此代碼擴展到我的應用程序的所有控制器?或者我必須在所有這些中定義它們。 – lapinkoira

相關問題