我需要在一个位置(从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]
答案 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设置机架中间件,这也很简单。但是如果您不想对某些特定的控制器操作进行任何更新,则必须对控制器进行检查。还要注意,它将是自动的,因此无需任何人注意(让您看到完全陌生的人),它将改变响应。我个人不太喜欢。