Используйте вспомогательный (или закрытый метод), который является рекурсивным и превращает ваши вложенные модели во вложенный хеш, затем используйте to_json
для генерации строки json.
Мне нужно было генерировать Json в HTML/ Представление Erb, но та же идея должна применяться, если вам нужно сгенерировать его из действия контроллера или использовать шаблон Erb для генерации Json.Мне также был нужен (жестко закодированный) корневой узел, который можно пропустить, если он не требуется.
category.html.erb
<script type="text/javascript">
$(function(){
var json = {
id: "node00",
name: "New Pathway",
data: {},
children:
<%= @categories.select { |c| c.root? && !c.leaf? }.collect { |c| category_to_spacetree_json(c) }.to_json.html_safe %>
};
init(json);
});
</script>
Categories_helper.rb
def category_to_spacetree_json(category)
hash = {
:id => category.id,
:name => category.name,
:data => '',
:children => []
}
unless category.leaf?
hash[:children] = category.children.public.collect { |c| category_to_spacetree_json(c) }
end
hash
end