(Ruby,Rails)CRUD在单个页面上嵌套了超过4级的模型......?

时间:2009-06-10 03:47:40

标签: ruby-on-rails nested models

尽可能多的令人惊讶的信息,它似乎往往只是我的疯狂要求。也就是说,我正在寻找一种机制来处理单个页面上的多个嵌套模型。

现在,我已经看到了嵌套两个模型(Railscasts等)的所有视频和帖子(不是真的,但是幽默我)。但是,我需要处理嵌套4深的模型,同时使用Javascript来保持页面清洁。

基本上我有网站 - >建筑物 - >控制器 - >测量并希望在一个页面上管理(CRUD)一个完整的站点。我确定它是可能的,但我还没有看到一个相当干净的方法,我可以把它包裹起来。如果有人有任何意见,我都是耳朵(或者视情况而定)。

提前致谢。

3 个答案:

答案 0 :(得分:3)

一些熟练的程序员建议only nesting resources 1 level deep。当然,您的域可能更复杂,但您不应在单个视图中公开所有这些复杂性。如果您真的需要在一个页面上管理整个站点,我建议您使用多个表单并通过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帖子。你可能想要一些更高级的东西,微调器,验证等等。还有空间,但这将使你开始使用单页界面。

答案 1 :(得分:1)

结帐http://activescaffold.com/和精简版 - http://streamlinedframework.org/ 两者都支持页面上的嵌套模型。

请注意,您可能需要为您的用户提供一些培训。 4级深度模型不是人们每天都会碰到的东西。

答案 2 :(得分:0)

我认为最简单的方法是在parent-gt;子对中分解它:

  • 站点 - &GT;建筑
  • Building-&GT;控制器
  • 控制器 - &GT;测定

然后你们之间只有一个简单的关系。