Rails Rabl - 自定义数组键
Rails Rabl - Custom array keys
我正在尝试自定义我的 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 个游戏,它 returns 4 个游戏,但它们都是相同的...
如果您有模型...
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
- I'm assuming your have a namespace
api
. I don't know if GET /api/games
really exists but, you get the idea.
- I'm assuming you have one position by player in one game.
我正在尝试自定义我的 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 个游戏,它 returns 4 个游戏,但它们都是相同的...
如果您有模型...
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
- I'm assuming your have a namespace
api
. I don't know ifGET /api/games
really exists but, you get the idea.- I'm assuming you have one position by player in one game.