我有一个像这样的代码示例:
def update
if @transaction.update(transaction_params)
render :show, status: :ok
else
render json: @transaction.errors, status: :unprocessable_entity
end
end
当我尝试更新不存在的记录时,换句话说,控制器引发ActiveRecord :: RecordNotFound。我不需要拯救和渲染任何东西,因为这个异常有自己的响应处理程序或什么,这是我在上面的方法提供无效id时在响应中得到的,邮递员截图:
这是文字版:
{
"status": 404,
"error": "Not Found",
"exception": "#<ActiveRecord::RecordNotFound: Couldn't find Transaction with 'id'=88 [WHERE \"transactions\".\"active\" = ?]>",
"traces": {
"Application Trace": [
{
"id": 6,
"trace": "app/controllers/api/v1/transactions_controller.rb:42:in `set_transaction'"
}
],
"Framework Trace": [
{
"id": 0,
"trace": "vendor/bundle/gems/activerecord-5.1.4/lib/active_record/relation/finder_methods.rb:343:in `raise_record_not_found_exception!'"
},
{
然而,当我添加自己的控制器类,并且我从模型中提升它时,如果我没有在控制器中专门解救它,我会得到500。
如何为ActiveRecord :: RecordNotFound完成此操作?如何为自定义错误添加响应处理程序?
答案 0 :(得分:0)
我建议您在ApplicationController中使用rescue_from
:
class ApplicationController
rescue_from MyOwnException do |exception|
render 'my_error_view'
end
end
或者您可以使用exception_app,在config/application.rb
中设置如下:
config.exceptions_app = routes
然后,您可以通过路线控制错误的呈现:
match '/404', to: 'exceptions#handle_404'
您可以在此博文中找到更多详细信息:Handling errors in Ruby on Rails