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

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

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

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

提前致谢。

一些熟练的程序员建议只嵌套1级深度的资源 。 当然,您的域可能更复杂,但您不应在单个视图中公开所有这些复杂性。 如果您确实需要在一个页面上管理整个站点,我建议您使用多个表单并通过AJAX更新各种显示,而不是尝试以一种forms完成所有操作。 您将拥有更好的可用性和更清晰的代码。

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; } ); }); 

这允许每个表单在发布post后从服务器发布并更新其可更新块的新版本。 你可以变得更加漂亮,并使用元数据插件来存储应该更新哪个块的信息以及有关请求的其他信息,但这很简单,并且允许您在html中查看配置。 data-x属性是HTML5的预定function,但无论如何我们都可以继续使用它们。

通过为远程表单创建约定,可以轻松地使用少量代码使jQuery处理所有ajaxpost。 你可能想要一些更好的东西,微调器,validation等等。还有空间,但这将使你开始使用单页界面。

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

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

我认为最简单的方法是在parent-> child对中将其分解:

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

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