【问题标题】:How to render two json objects as response on a rails controller如何在 Rails 控制器上呈现两个 json 对象作为响应
【发布时间】:2016-08-05 16:17:30
【问题描述】:

我需要一些帮助 我有一个控制器,它有一个查询两个模型的操作。 现在我需要将它们都作为 json 发送,以便在我的角度视图中使用。

在下面的示例中,我应该如何在一个 json 响应中发送“复杂”及其“字段”?

例如

def complexes_and_fields
  complex = Complex.find(params[:id])
  search_params = {complex_id: complex._id}
  fields = Field.where(search_params)
  if !complex.nil?
    render json: ???.to_json, status: :ok
  else
    render json: { error_description: 'no complex found' },status: :bad_request
end

【问题讨论】:

    标签: ruby-on-rails json ruby ruby-on-rails-3 controller


    【解决方案1】:

    一个简单的方法是用你的对象构建一个哈希

    complex = Complex.find(params[:id])
    search_params = {complex_id: complex._id}
    fields = Field.where(search_params)
    
    render json: { complex: complex, fields: fields, search_params: search_params }, status: :ok
    

    另一种方法是使用诸如some_view.json.erb 之类的视图,您可以在其中渲染对象,就像您在角度视图中所期望的那样。你也可以使用 ActiveModelSerializers,阅读https://github.com/rails-api/active_model_serializers

    理想情况下,您要做的是将此响应封装到其对象中,并在控制器中进行一次调用以返回结果

    类似这样的事情不做太多介绍

    results = MyComplexFieldsObj.response(params[:id])
    render son: results, status: :ok
    

    【讨论】:

    • 谢谢,第一个选项帮助了我。借助 Jim 发布帮助结束了对解决方案的理解和实施。谢谢。
    • 很高兴你发现它有帮助 @Pablo。我也喜欢您使用最后一个解决方案的事实;)当您可以在没有依赖关系的情况下找到解决方案时,我不喜欢重复使用 gem,除非事情很复杂。
    • 我也喜欢简单,根据我的经验,早期绑定到 JSON 的故障模式非常糟糕。当您列出博客文章时,假设您包括正文,但在许多情况下您只需要标题和作者。您最终将选项传递给 to_json 等,很快您就会遇到很多情况,以至于您希望自己刚刚构建了对象。上手没问题,但要小心!而且,当您需要对 API 进行版本控制时,没有任何基于纯模型的支持。
    【解决方案2】:

    这是 Rails 应用程序中极为常见的要求。这种需求很少局限于单个模型或单个位置。因此,存在各种 gem 来提供这种功能(在许多情况下,不会大幅改变 render 行的签名)。

    This post 提供了一个很好的列表。就个人而言,我对 active_model_serializers 有很好的体验,对葡萄实体也有过可接受的体验。查看他们的文档并确定最适合您的文档是合理的。

    【讨论】:

    • 感谢页面让我对如何以多种方式解决我的需求有了很多了解。使用最后一个解决方案结束。谢谢
    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 2013-12-24
    • 2015-02-03
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    相关资源
    最近更新 更多