Rails Rabl - 自定义数组键

时间:2016-04-20 15:10:42

标签: ruby-on-rails rabl

我正在尝试自定义我的RABL API响应。我有一系列游戏,每个游戏包含多个玩家。现在我的玩家存储在一个数组中,但我需要通过一个键来访问它们,所以我想自定义我的json响应。

这是我的base.rabl文件:

collection @games
attributes :id
child(:players) do |a|
  attributes :id, :position
end

这就是我得到的:

[
  {
    id: 1,
    players: [
      {
        id: 27,
        position: 'goalkeeper'
      },
      {
        id: 32,
        position: 'striker'
      },
      {
        id: 45,
        position: 'defender'
      }
    ]
  }
]

这就是我想要的:

[
  {
    id: 1,
    goalkeeper: {
      id: 27
    },
    striker: {
      id: 32
    },
    defender: {
      id: 45
    }
  }
]

现在我找不到一种方法来显示除了一系列物体之外的其他玩家。

有人会给我一个打击吗?我尝试了很多rabl配置,但现在没有成功......

修改

我更改了属性,使其更加明确。每个游戏都有众多玩家,每个玩家都有不同的位置。

为了添加更多细节以便您了解我想要实现的目标,这是我最好的尝试:

base.rabl文件:

object @games

@games.each do |game|
  node(:id) { |_| game.id }
  game.players.each do |player|
    if (player.position == 'goalkeeper')
      node(:goalkeeper) { |_| player.id }
    elsif (player.position == 'striker')
      node(:striker) { |_| player.id }
    end
  end
end

这就是我得到的:

[
  {
    id: 1,
    goalkeeper: {
      id: 27
    },
    striker: {
      id: 32
    }
  },
  {
    id: 1,
    goalkeeper: {
      id: 27
    },
    striker: {
      id: 32
    }
  }
]

结构是我想要的,但每回游戏都是一样的。如果我的查询结果包含4个游戏,则返回4个游戏,但它们都是相同的......

1 个答案:

答案 0 :(得分:1)

如果您有型号......

class Game < ActiveRecord::Base
  has_many :players
end

class Player < ActiveRecord::Base
  belongs_to :game
end

base.json.rabl文件中,您可以执行以下操作:

attributes :id

node do |game|
  game.players.each do |player|
    node(player.position) { { id: player.id } } # I suggest node(pos) { player.id }
  end
end

index.json.rabl中,您需要:

collection @games
extends 'api/games/base' # the base.rabl path

show.json.rabl中,您需要:

object @game
extends 'api/games/base' # the base.rabl path

在你需要做的GamesController中:

respond_to :json

def index
  @games = Game.all
  respond_with @games
end

def show
  @game = Game.find(params[:id)
  respond_with @game
end

因此,如果您的请求是GET /api/games,则会点击index.json.rabl,您将获得所需的回复。

如果您只想看一款游戏,则需要点击GET /api/games/:id

  
      
  • 我假设您有一个名称空间api。我不知道GET /api/games是否真的存在但是,你明白了。
  •   
  • 我假设你在一场比赛中有一个位置。
  •