Некоторые опытные программисты рекомендуют только вложенные ресурсы глубиной 1 уровень . Конечно, ваш домен может быть более сложным, но вы не должны раскрывать всю эту сложность в одном представлении. Если вам действительно нужно для управления всем сайтом на одной странице, я рекомендую вам использовать несколько форм и обновлять различные дисплеи с помощью AJAX, а не пытаться делать все это в одной форме. Вы получите лучший юзабилити и более чистый код.
EDITED
Хорошо, вот примерное представление в HAML:
%h1 Editing Site
#site-form
- form_for @site, :class => 'remote', :'data-update' => '#site-form' do |f|
%p
= f.label :name
= f.text_field :name
%p
[All the other fields on your Site model]
%p
= f.submit "Save Site"
%h2
Buildings for
= @site.name
#buildings-forms
- for building in @site.buildings
%div{ :id => "building-#{building.id}" }
- form_for building, :class => 'remote', :'data-update' => "#building-#{building.id}" do |f|
%p
= f.label :name
= f.text_field :name
%p
[All other building fields]
%p
= f.submit "Save Building"
%h3
Controllers for
= building.name
- for cntroller in building.controllers
%div{ :id => "controller-#{cntroller.id}"}
- form_for cntroller, :class => 'remote', :'data-update' => "#controller-#{cntroller.id}" do |f|
%p
= f.label :name
= f.text_field :name
%p
[All other controller fields]
%p
= f.submit "Save Controller"
И следующий уровень, Измерения, будет выглядеть примерно так же.
Что касается получения AJAX, в jQuery вы говорите:
$( function() {
$('form.remote').submit( function() {
var submitted_form = this;
$.post( this.action, $.serialize(this), function( data_returned, status, request ) {
var updated_block = $( data_returned ).find( $(submitted_form).attr('data-update').html();
$( $(submitted_form).attr('data-update') ).html( updated_block );
} );
return false;
} );
});
Это позволяет каждой форме публиковать и обновлять свой обновляемый блок новой версией с сервера после того, как сообщение произошло. Вы можете стать более любопытным и использовать плагин метаданных для хранения информации о том, какой блок должен быть обновлен, и другой информации о запросе, но это просто и позволяет вам увидеть конфигурацию в вашем html. Атрибуты data-x являются запланированной функцией HTML5, но мы все равно можем их использовать.
Создавая соглашение для ваших удаленных форм, легко заставить jQuery обрабатывать все ваши сообщения ajax с небольшим количеством кода. Вы, вероятно, захотите некоторые более интересные вещи, бланки, валидации и т. Д. Есть место для этого, но это поможет вам начать с одностраничного интерфейса.