【问题标题】:(Ruby,Rails) CRUD nested models more than 4 levels deep on a single page...?(Ruby,Rails)CRUD 嵌套模型在单个页面上超过 4 级...?
【发布时间】:2009-06-10 03:47:40
【问题描述】:

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

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

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

提前致谢。

【问题讨论】:

    标签: ruby-on-rails nested models


    【解决方案1】:

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

    【讨论】:

    • 正是我有兴趣做的。我只是无法理解 AJAX 控制 AJAX 控制 AJAX 的概念。我想所有的“形式”都是独立的,但它似乎有点单一(尽管对于这个特定的项目来说是“必要的”)。更重要的是,我需要弄清楚一些质量视图管理和部分创建。我想我会从头开始,然后回去工作。如果您对实施有任何想法,我会全力以赴。谢谢。
    • 太棒了!我会试一试的。非常感激。问题:“控制器”是保留字吗?我在任何地方都找不到它。
    • 在视图中,“controller”是ActionView::Base的一个属性,它指的是当前请求的Controller。 Controller 可能不是保留字,但它被大量用作 Rails 命名约定的一部分,这会影响依赖项的加载和缓存方式。我建议您查阅词库以找到合适的替代方案。
    • 所以您提供的这段代码似乎用于“仅显示”。我一直在阅读,但我似乎无法弄清楚每个部分的“新”和“编辑”操作。我想我真的在尝试重新创建“active_scaffold”的一些功能。但是,我没有尝试通读他们的所有代码,而是一直在盲目拍摄。哦,好吧,对于我想的代码... ...与此同时,如果您有任何关于 NEW 和 EDIT 活动的输入,我会全神贯注。感谢您迄今为止的所有帮助。
    • 以上引用的所有表单都假定为编辑表单。您必须有点创意才能为新的嵌套模型制作像这样的模式,但这绝对是可能的。恐怕您的评论对我来说不是很清楚 - 您希望在 EDIT 视图中看到什么?
    【解决方案2】:

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

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

    【讨论】:

    • +1 表示 ActiveScaffold。对于报纸网站,我已经完成了问题 -> 部分 -> 文章 -> 嵌套脚手架中的图像。
    • 是的,“流线型”框架刚推出时,我实际上使用了不少。我真的很想了解正在发生的事情。至于用户,我不确定他们是否会关心,因为它将以视觉直观的方式表示(功能上与从连续的下拉框中选择以选择下一个下拉框没有什么不同)。感谢您的帖子。
    【解决方案3】:

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

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

    那么你在所有 4 之间有一个简单的关系。

    【讨论】:

    • 是的,我已经搞定了关系。这不是问题,但谢谢。
    • 这样按页面管理它们没有问题,我只是在寻找一种通过 javascript 等以直观方式显示所有这些页面的方法。我不希望有人去 4 或 5 个不同的页面来管理一个站点。你知道吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多