2012-03-28 4 views
0

Я разрабатываю новый API для моего проекта, и я хочу возвращать объекты, у которых вложенные дети как json. Для этого я решил использовать RABL.Произвольное вложение некоторых атрибутов в rabl

Я хочу, чтобы клиентская сторона могла понять, действителен ли объект, а если нет, то какие поля отсутствуют, чтобы сохранить его правильно.

Дизайн, который, как я думал, должен включать в себя некоторые поля как необязательные, под дополнительным хэшем, а остальные - обязательными. Обязательные поля должны появиться прямо под корнем json. Поэтому выход я пытаюсь описать должен выглядеть следующим образом:

{ 
    "name": "John", 
    "last_name": "Doe", 
    "optional": { 
     "address": "Beverly Hills 90210", 
     "phones":[{"number":"123456","name":"work"}, {"number":"654321","name":"mobile"}] 
    } 
} 

Приведенный выше пример вывода описывает обязательные поля имя и фамилию, а не нужный адрес и телефон (который связан в belongs_to-has_many отношение к объекту). имя, имя_данных и адрес - это поля базы данных пользователя.

Воспроизведение с помощью RABL Пока не удалось создать такую ​​структуру.

Любые предложения? Я ищу СУХОЙ способ реализовать это для всех моих моделей.

ответ

1

RABL действительно хорош в создании конструкций JSON на лету, поэтому я не понимаю, почему вы не смогли достичь своей цели. Пробовали ли вы тестировать, установлено ли в схеме значение null в модуле и, таким образом, представлено как необязательное? Для меня это хороший подход. Для вложенных детей просто делайте то же самое, но расширяйте шаблон для детей.

Например, в вашем father/show.rabl отображается настраиваемый узел :optional со всеми свойствами, которые могут быть пустыми.

Затем создайте child/show.rabl с той же логикой. Наконец, вернитесь к father/show.rabl и добавьте дочерний узел, расширяя шаблон child/show.rabl. Таким образом, вы можете достичь неограниченных уровней «опционных».

Надеюсь, это помогло вам.

0

В этом случае я бы воспользовался опцией бесплатной формы.

От https://github.com/nesquena/rabl

Там также может быть нечетным случаи, когда корневой уровень ответа не отображающие непосредственно к любому объекту.

В таких случаях объект может быть присвоен «false» , а узлы могут быть построены в свободной форме.

object false 
node(:some_count) { |m| @user.posts.count } 
child(@user) { attribute :name } 
Смежные вопросы