我在尝试设置第一个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"}
}
这样的事情可能吗?
答案 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