2016-04-20 2 views
2

Я пытаюсь настроить ответ RABL API. У меня есть коллекция игр, и в каждой игре есть несколько игроков. Пока мои игроки хранятся в массиве, но мне нужно получить к ним доступ с помощью ключа, поэтому я хотел бы настроить свой ответ json.Rails Rabl - Пользовательские ключи массива

Вот мой 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, но без успеха сейчас ...

EDIT:

Я изменил атрибуты, так что более явным. Каждая игра имеет множество игроков, и каждый игрок имеет другую позицию.

Для того, чтобы добавить больше деталей, чтобы вы могли понять, что я пытаюсь достичь, вот моя лучшая попытка:

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

Если у вас есть модели ...

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, но у вас есть идея.
  • Я предполагаю, что у вас есть одна позиция игрока в одной игре.
+0

Спасибо за ваш ответ. Но в моем случае это не сработает. Я редактировал свой пост, чтобы добавить более подробную информацию, чтобы вы могли более точно понять, чего я пытаюсь достичь. – alskaa

+0

Я думаю, что вы не понимаете концепцию rabl 'collection' и' object. Я обновил свой ответ на примере с контроллера. – Leantraxxx

+0

Вы правы, это первый проект, в котором я использую rabl, и я не использовал его правильно. Теперь я думаю, что понимаю :) Большое спасибо за ваш подробный ответ, это мне очень помогло! – alskaa

Смежные вопросы