Rails通用未找到控制器方法

时间:2016-04-16 11:23:27

标签: ruby-on-rails activerecord

在我的控制器中,我在以下某个操作中使用了此代码:

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响应

1 个答案:

答案 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继承的所有其他控制器。