在ruby

时间:2017-04-06 04:06:58

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

我正在ruby中构建rest API

我使用@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-我需要在视频和用户对象中传递手动键和值(不在db中),目前可以使用视频而不是用户。应该可以使用父对象及其子关联对象。我不想使用:相同的方法

2 - 我需要传递参数in:方法,就像视频模型有一个方法is_upvoted但有一个像当前用户的参数。所以我无法传递参数:方法。目前我可以做我正在做的合并,但用户对象是不可能的。

3-我需要在使用时更改密钥名称包括:{user:{method:[]}}。 我需要使用密钥"所有者"在"用户"

的地方

非常感谢提前

1 个答案:

答案 0 :(得分: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

您可以在documentation中找到有关JBuilder的详细信息。