2009-06-10 13 views
1

多くの驚くべき情報がそこにありますが、それはしばしば私の痴漢的な要求に足りないと思われます。つまり、私は1ページで複数のネストされたモデルを処理する仕組みを探しています。(Ruby、Rails)1ページに4レベル以上の深さのCRUDネストされたモデル...?

今、私は2つのモデル(Railscastsなど)を入れ子にして、すべての動画と投稿を見ました。しかし、私は4つの深みを入れ子にしたモデルを扱う必要がありますが、その間ずっとJavascriptを使ってページをきれいに保つ必要があります。

基本的に私はサイト - >ビルディング - >コントローラ - >測定を持ち、1ページに完全なサイトを管理したい(CRUD)。私はそれが可能だと確信していますが、私はまだ私の頭を包むことができる合理的にきれいな方法を見ている。誰かが入力を持っている場合、私はすべての耳(または場合によっては目)です。

ありがとうございます。

答えて

3

一部の熟練プログラマは、only nesting resources 1 level deepを推奨しています。確かにあなたのドメインはもっと複雑になりますが、その複雑さをすべて単一のビューに公開するべきではありません。サイト全体を1ページで管理するには、実際にが必要な場合は、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投稿を簡単に処理できるようになります。あなたは、おそらくいくつかの面白いもの、スピナー、バリデーションなどが必要です。そのための余地がありますが、これはあなたが単一のページインターフェイスで始めることができます。

+0

これは*私がやっていることです。私はAJAXを制御しているAJAXを制御しているAJAXのコンセプトの周りに頭を抱えているだけで問題はありません。私はすべての "フォーム"は独立しているだろうと思うが、(この特定のプロジェクトには「必要」ではあるが)少しモノリシックなようだ。 さらに重要なのは、私は質の高いビュー管理と部分的な作成を理解する必要があります。私は終わりから始まり、帰り道に行くと思います。実装上の考えがあれば、私はすべて耳にします。ありがとう。 –

+0

優秀!私はそれを与えるだろう。とても有難い。質問:「コントローラ」は予約語ですか?私はどこでもそれを見つけることができません。 –

+0

ビューでは、 "controller"はActionView :: Baseの属性で、現在の要求のControllerを参照します。コントローラは予約語ではないかもしれませんが、Railsの命名規則の一環として頻繁に使用されています。これは、依存関係がどのようにロードされ、キャッシュされるかに影響します。適切な選択肢のためにシソーラスに相談することをお勧めします。 – austinfromboston

0

私は最も簡単な方法は、parent->子のペアでそれを打破するだろうと思う:

  • サイト - >構築
  • Building->コントローラー
  • Controller->測定

あなたはすべての間に単純な関係があります。

+0

うん、私は関係を失ってしまった。それは問題ではなく、thxです。 –

+0

私は、ページ単位でそれらを管理することに問題はありません。私は単純に、javascriptなどを介してこれらのページをすべて直観的に表示する方法を探しています。私は誰かに1つのサイトを管理するために4つまたは5つの異なるページに行くことを嫌っています。ええ、知っている? –

1

チェックアウトhttp://activescaffold.com/と合理化 - - http://streamlinedframework.org/ はどちらもページ上のネストされたモデルをサポートします。

あなたのユーザーにとっては、おそらくトレーニングが必要なことに注意してください。 4レベルの深いモデルは、人々が毎日遭遇するものではありません。

+0

+1 ActiveScaffold。新聞のウェブサイトについては、私は問題 - >セクション - >記事 - >イメージを入れ子にした足場で行った。 – zenazn

+0

ええ、デビューしたとき、私は実際に「合理化された」フレームワークを使っていました。私は本当に何が起こっているのか理解しています。ユーザーにとっては、視覚的に直感的な方法で表現されるので気にする必要はありません(機能的には、次のドロップボックスを選択するために連続したドロップボックスから選択することと同じです)。 ポストに感謝します。 –

関連する問題