(Ruby、Rails)CRUD 嵌套模型在单个页面上深度超过 4 层……?
-
13-09-2019 - |
题
尽管有很多令人惊奇的信息,但它似乎常常达不到我疯狂的要求。也就是说,我正在寻找一种机制来处理单个页面上的多个嵌套模型。
现在,我已经看过所有关于嵌套两个模型(Railscasts 等)的视频和帖子(不是真的,而是幽默一下)。然而,我需要处理嵌套 4 层的模型,同时使用 Javascript 来保持页面干净。
基本上我有站点 -> 建筑物 -> 控制器 -> 测量,并且希望在单个页面上管理(CRUD)完整的站点。我确定是 可能的, ,但我还没有看到一个我可以理解的相当干净的方法。如果有人有任何意见,我会洗耳恭听(或视情况而定)。
提前致谢。
解决方案
某些熟练的程序员推荐仅嵌套资源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的配置。数据-X属性是HTML5的预定功能,但我们可以继续前进,反正使用它们。
通过创建远程形成一个惯例,它很容易使jQuery的处理与代码少量所有的AJAX的帖子。你可能会想一些票友东东,纺纱,验证等方面的房间对于这一点,但是这将让你开始用一个单页的界面。
其他提示
查看 http://activescafold.com/ 并精简—— http://streamlinedframework.org/两者都支持页面上的嵌套模型。
请注意,您可能需要对用户进行一些培训。4 级深度模型并不是人们每天都会遇到的东西。
我认为最简单的方法是将其分解为父->子对:
- 站点->建筑物
- 建筑->控制器
- 控制器->测量
那么这 4 者之间就有了简单的关系。