2017-04-06 61 views
2

响应我建立的REST API的红宝石自定义as_json红宝石

我使用@object.as_json()为JSON格式的响应

我被陷在中间,而传输的数据as_json。我需要更多的定制我列出正是我想要的响应

和我在哪里卡住

我使用下面的代码

@videos = Video.all.map{|m| m.as_json(
    only: [:title], 
    method: [:watch_count], 
    include: { 
    user: { 
     only: [:first_name], 
     method: [:role] 
    } 
    } 
).merge(
    is_upvoted: m.is_upvoted(current_user) 
) } 

但我需要对其进行自定义。

1-我需要在视频和用户对象中传递手动键和值(不在数据库中),目前可以使用视频而不是用户。它应该可能与父对象及其子对象相关联。我不想使用:方法相同

2 -I需要传入参数:方法,与视频模型一样,is_upvoted方法有一个像当前用户那样的参数。所以我无法传递参数:方法。目前我可以使用合并来完成,但是用户对象无法实现。

3-我需要更改键名时使用include:{user:{method:[]}}。 我需要提前

+0

显式地执行'user.as_json',然后合并结果? – mudasobwa

回答

0

使用键“老板”在“用户”

非常感谢的地方你可以用JBuilder做到这一点,它更灵活,并允许从你的清单让所有的事情。结果代码将是这样的:

@videos = JBuilder.encode do |json| 
    json.array! Video.all do |video| 
    json.(video, :title, :watch_count) 
    json.is_upvoted video.is_upvoted(current_user) 

    json.owner do 
     json.(video.user, :first_name, :role) 
     json.field video.user.with_param(some_param) 
    end 
    end 
end 

您可能会发现有关documentationJBuilder细节。