有没有办法将所有控制器方法的响应包装在 application_controller.rb 中的 json 对象中?

Is there a way to wrap the response of all controller methods in a json object in application_controller.rb?

我需要在一个地方(base_controller.rb 继承自 application_controller.rb)编写一些代码,将来自控制器的所有传出 json 响应包装在一个 json 对象中returning.

在我的 Rails (5.x.x) 应用程序中,有大约 100 个端点服务于不同类型的数据(json 对象、数组、数组的数组等)。由于最近的需要,我必须将它们全部包装在一个父对象中。

以前的状态:

some_controller.rb

return_obj = { key: value }
render json: return_obj

预期状态:

some_controller.rb 将 return { key: value },但这将被 base_controller.rb 拦截,进而 return 类似 { payload: { key: value }, other_info: info }

Option-1: 我们的设置中有类似的东西,我们所做的是,我们在 base_api_controller 中有一个名为 render_response 的方法文件。看起来像:

  def render_response(render_params)
    # controller_name, action_name will give you controller and action which rendered the response.
    # so you can decide weather to process anything or just render

    render_params[:json] = { payload: render_params[:json] }
    render render_params
  end

并且您的控制器操作将转换为类似以下内容:

return_obj = { key: value }
render_response json: return_obj

就我个人而言(显然)我喜欢第一种方法,因为它是明确的,并且查看控制器代码可以为我们提供我们正在进一步处理响应的信息。

Option-2: 如果你不喜欢用 render_response 替换 render 你可以按照this guide 设置机架中间件,这也非常简单。但是如果您不想对某些特定的控制器操作进行任何更新,则必须对控制器进行检查。还要注意它是自动的,所以在没有人注意到的情况下(让你的代码完全陌生的人)它会改变响应。我个人不太喜欢。