使用Grape创建一个返回嵌套哈希的api端点

时间:2014-12-12 18:25:56

标签: ruby-on-rails ruby json ruby-on-rails-4 grape

我在尝试设置第一个API时遇到问题。我有一个API端点与Grape一起使用,但我不确定如何获得我想要的正确数据哈希。

现在API很简单,看起来像这样:

    module CategoryTopic
      class API < Grape::API
        prefix "api/v1"
        format :json

        resource "categories" do
          get do
            Category.all
          end
        end

      end
    end

然后返回

[{"id":1,"category_name":"General Questions"}]

但在我的应用程序中,有一个类别has_many主题,我想返回一个如下所示的哈希:

{categories: 
  {"Numbers": "1", "2"},
  {"Colors": "Red", "Blue"}
}

这样的事情可能吗?

1 个答案:

答案 0 :(得分:2)

是的,这是可能的。我假设您要从 / api / v1 / categories URL返回该JSON。

首先,我不同意你提出的JSON,因为它看起来不对。如果类别与主题具有has_many关联,则结果JSON应返回类别属性及其中的所有相关关联。在我看来,它应该是这样的:

[
    { "id":"1", "category_name": "General Questions", 
          topics: [ { "numbers":["1", "2"], "colors": ["Red", "Blue"] } ] }
]

在这种情况下,您必须安装Grape Entity gem(https://github.com/intridea/grape-entity)并创建两个这样的实体:

class CategoryEntity < Grape::Entity
    expose :id
    expose :category_name
    expose :topics, :using => TopicEntity
end

class TopicEntity < Grape::Entity
    expose :numbers
    expose :colors
end

不直接从API返回模型始终是一个好习惯。您应该使用实体来屏蔽API客户端的模型表示。接下来,需要此gem并在您的API类中使用您的全新实体,如下所示:

require 'grape-entity'

module CategoryTopic
  class API < Grape::API
    prefix "api/v1"
    format :json

    resource "categories" do
      get do
        present Category.all, :with => CategoryEntity
      end
    end

  end
end