использование JSON в Rails, Backbone и Mustache - форматы, кажется, отличаются - PullRequest
5 голосов
/ 01 июля 2011

Я пытаюсь собрать приложение Rails с backbone.js и шаблонами усов.Я обнаружил, что JSON, требуемый магистралью, не совместим с JSON, требуемым Усиком.(Я начал с этого урока Cloudedit -a backbone.js на примере , но я хочу использовать Усы там, где он использует JST.

Для магистрали мы должны установить ActiveRecord :: Base.include_root_in_json = false. Для моей модели (человек с именем и фамилией) данные, отправленные рельсами из / people, выглядят так:

[{"firstname":"Jane","surname":"Jones"},{"firstname":"Janet","surname":"Jensen"}]

Мой шаблон усов выглядит так:

<h3><a href='#new'>Create New</a></h3>
<h4>People</h4>
<ul>
{{#people}}
<li>{{firstname}} {{surname}}</li>
{{/people}}
</ul>

и из документов с усами, я ожидаю, что он хочет увидеть:

{"people":[{"firstname":"Jane","surname":"Jones"},{"firstname":"Janet","surname":"Jensen"}]}

Отредактировал меня, преобразовав коллекцию JS обратно в JSON и отправив в Mustache. Не нужно этого делатьMustache.js ожидает увидеть объекты js, а не строки JSON.

К тому времени, когда я добираюсь до Mustache.to_html, у меня есть базовая коллекция моделей. Модели имеют атрибуты firstname и фамилия . В firebug это выглядит следующим образом:

collection
  +_byCid
  +_byId
   length 2
  - models  [object { attributes=(...), more...}, object {attributes=(...), more...}]
    - 0 object { attributes=(...), more...}
      ....... some more properties of the object
        + attributes object {firstname="Janet", surname="Jensen"}

Кажется, здесь есть пара проблем: 1. В названии коллекции нет упоминания.(люди). Яя могу обойти это различными способами, я думаю, по крайней мере, используя {{#models}} .. {{/ models}} в шаблоне.

  1. Атрибуты скрыты глубже, чем Mustache.jsвыглядит.Когда он пытается найти тег «firstname» в объекте, он ищет объект ['firstname'] и не находит его, но object.attributes ['firstname'] имеет правильное значение.

Кажется, я здесь все перепутал ... Так что же я делаю не так?И как я могу это исправить?

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Более простым решением было бы использование toJSON в Коллекции, как описано здесь - http://documentcloud.github.com/backbone/#Collection-toJSON

out = Mustache.to_html(tpl, collection.toJSON);
2 голосов
/ 03 июля 2011

У меня теперь есть своего рода решение (благодаря этому вопросу ).

jsonForTemplate = JSON.parse(JSON.stringify(this.people)); //this works for a single item
context['people']=jsonForTemplate;    //need to add this for a collection
out = Mustache.to_html(tpl,context);

но такое ощущение, что такого рода прыжки через обручи не должно бытьнеобходимо.Я проверю, предлагает ли руль что-нибудь лучше.

...