在我的控制器中,我在以下某个操作中使用了此代码:
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参数和Object的类型吗?
像一些通用的404,500,400,200方法一样,我只能传递一些参数来呈现JSON响应
答案 0 :(得分:3)
在ApplicationController中使用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继承的所有其他控制器。