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

时间:2019-06-26 11:51:56

标签: ruby-on-rails interceptor actioncontroller

我需要在一个位置(从base_controller.rb继承的application_controller.rb处编写一些代码,该代码将来自控制器的所有传出json响应包装在json对象中,然后返回)。

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

以前的状态:

some_controller.rb

return_obj = { key: value }
render json: return_obj

预期状态:

some_controller.rb将返回{ key: value },但这将被base_controller.rb拦截,而{ payload: { key: value }, other_info: info }则将返回类似query=AAA.objects.all().prefetch_related(BBB.objects.all()) query[500000:501000]

的内容。

1 个答案:

答案 0 :(得分:2)

选项1::我们在设置中有一些相似之处,就是在render_response文件中有一个名为base_api_controller的方法。看起来像这样:

  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

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

选项2: 如果您不喜欢将render替换为render_response ,则可以按照this guide设置机架中间件,这也很简单。但是如果您不想对某些特定的控制器操作进行任何更新,则必须对控制器进行检查。还要注意,它将是自动的,因此无需任何人注意(让您看到完全陌生的人),它将改变响应。我个人不太喜欢。