我有几个型号。我们称之为Widget和Gadget。
我的Widget和Gadget的#index看起来像这样
def index
widgets = Widget.all
if widgets
respond_with widgets, each_serializer: Api::V1::WidgetSerializer
else
render json: { message: [t(:not_found_widget)] }, status: :not_found
end
end
def index
gadgets = Gadget.all
if gadgets
respond_with gadgets, each_serializer: Api::V1::GadgetSerializer
else
render json: { message: [t(:not_found_gadget)] }, status: :not_found
end
end
我的序列号......
class Api::V1::WidgetSerializer < ActiveModel::Serializer
attributes :id, :desc
end
class Api::V1::GadgetSerializer < ActiveModel::Serializer
attributes :id, :desc
end
但是,我需要一个返回1中的两个资源的资源。我需要同时返回小部件和小工具。所以json看起来像......
{
"widgets": [
{
"id": 1,
"desc": "One"
},
{
"id": 2,
"desc": "Two"
}
],
"gadgets": [
{
"id": 1,
"desc": "One"
},
{
"id": 2,
"desc": "Two"
}
]
}
我怎样才能做到这一点。像
这样的东西widgets = Widget.all
gadgets = Gadget.all
respond_with widgets, each_serializer: Api::V1::WidgetSerializer, gadgets, each_serializer: Api::V1::GadgetSerializer
然而,这显然无效。
答案 0 :(得分:3)
序列化程序类不必匹配AR模型。序列化程序类应该用作您要生成的JSON的表示形式。在您的示例中,我们假设要调用新的序列化程序DashboardSerializer
,然后您可以将widgets
和gadgets
放在那里:
class DashboardSerializer < ActiveModel::Serializer
self.root = false
attributes :widgets, :gadgets
def widgets
Widget.all
end
def gadgets
Gadget.all
end
end
答案 1 :(得分:0)
我能看到这个工作的唯一方法是,如果你有一个具有多个小部件和has_many小工具的模型,它有自己的序列化器,因为AMS会将正确的序列化器应用于序列化器中声明的关联。
类似
$.getJSON("https://api.twitch.tv/kraken/streams.json?channel=viagamehs,starladder1&callback=?", function(response){
response = JSON.stringify(response);
console.log(response);
});