2

尽管有很多令人惊奇的信息,但它似乎常常达不到我疯狂的要求。也就是说,我正在寻找一种机制来处理单个页面上的多个嵌套模型。

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

基本上我有站点 -> 建筑物 -> 控制器 -> 测量,并希望在单个页面上管理(CRUD)一个完整的站点。我确信这是可能的,但我还没有看到一个相当干净的方法,我可以围绕它包住我的头。如果有人有任何意见,我会全神贯注(或视情况而定)。

提前致谢。

4

3 回答 3

3

一些熟练的程序员建议只将资源嵌套 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"

下一个级别,测量,看起来几乎相同。

至于让 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 帖子。您可能需要一些更高级的东西、微调器、验证等。还有空间,但这将使您开始使用单页界面。

于 2009-06-10T03:59:27.447 回答
1

查看http://activescaffold.com/ 和 Streamlined -- http://streamlinedframework.org/ 都支持页面上的嵌套模型。

请注意,您可能需要对用户进行一些培训。4 级深度模型并不是人们每天都会遇到的。

于 2009-06-10T03:53:47.430 回答
0

我认为最简单的方法是将其分解为父->子对:

  • 站点->建筑
  • 建筑->控制器
  • 控制器->测量

然后你在所有 4 之间有一个简单的关系。

于 2009-06-10T03:52:52.487 回答