【问题标题】:Customise as_json response in ruby在 ruby​​ 中自定义 as_json 响应
【发布时间】:2017-04-06 04:06:58
【问题描述】:

我正在用 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- 我需要在视频和用户对象中传递手动键和值(不在数据库中),目前可以使用视频但不能使用用户。它应该可以与父对象及其子关联对象一起使用。我不想使用 :method 来做同样的事情

2-我需要在 :method 中传递参数,比如视频模型有一个方法 is_upvoted 但有一个像当前用户一样的参数。所以我无法在 :method 中传递参数。目前我可以像我一样使用合并,但它不能使用用户对象。

3- 使用时我需要更改键名:{user: {method: []}}。 我需要在“用户”的地方使用密钥“所有者”

提前致谢

【问题讨论】:

  • 明确执行user.as_json 并在之后合并结果?

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


【解决方案1】:

您可以使用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 的详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    相关资源
    最近更新 更多