一部の熟練したプログラマーは、1レベルの深さのリソースのみをネストすることを推奨しています。確かに、ドメインはより複雑になる可能性がありますが、その複雑さのすべてを1つのビューで公開するべきではありません。サイト全体を1つのページで管理する必要がある場合は、すべてを1つのフォームで行うのではなく、複数のフォームを使用してAJAXを介してさまざまな表示を更新することをお勧めします。使い勝手が良く、コードがすっきりします。
編集済み
さて、これが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"
そして、次のレベルであるMeasurementsは、ほとんど同じように見えます。
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投稿を簡単に処理させることができます。おそらく、より洗練されたもの、スピナー、検証などが必要になるでしょう。そのための余地はありますが、これにより、単一ページのインターフェースから始めることができます。