2012-06-24 46 views
0

因此,在一个Rails应用程序中,我在我的数据库中有一张桌子,硬盘驱动器,并且对于每个硬盘驱动器,我都有可变数量的磁头和磁盘。当我创建或编辑硬盘驱动器时,我想要a)动态显示需要的磁头状态和磁盘状态形式的数量,或者b)将用户连续路由到具有适当数量的磁头和状态表单的页面这一页。我赞成选项a,但我认为它需要一些自定义JavaScript或其他东西才能使其工作(除非有插件,我不知道javascript),这并不是真的可行。真的,我想拒绝任何没有拼盘和头部状态的硬盘。Rails - 创建父项时如何动态创建属于has_many关系的成员?

(变量名称当然hard_drive,platter_status,和head_status的)

有关示例,如果我有一台笔记本电脑驱动,我想限定它具有1头和盘片同时创建的驱动器。无论是当组合框的值为&盘片计数变化时,显示盘片&头部状态的形式。当创建按钮被击中时,它应该使用数据在数据库中创建hard_drive,并根据需要创建platter_status和head_status项目中的每一个。

我如何做到这一点?我知道在视图中,我必须添加一些能够检测组合框中的变化并使用组合框中的值显示布局。

它在性质上类似于this


编辑1: 所以,我有this,到目前为止它不工作,但我有个好主意。我偶然发现了一些讨论使用javascript来动态添加html的线程。

<div class="field" id="head_count" > 
    <label for="hard_drive_head_count">Head count</label><br /> 
    <input id="hard_drive_head_count" name="hard_drive[head_count]" type="number" value="0" /> 
    <script type="text/javascript"> 
     var input = document.getElementById('hard_drive_head_count'), 
     events = [ 
     "input", 
     ]; 
     events.map(function(ev) { 
     input.addEventListener(ev, function() { 
     console.log(ev + ' => ' + input.value); 
    if (parseInt(input.value) === 1) { 
     document.getElementById('platter_statuses').innerHTML= "howdy"; 
    } else { 
     document.getElementById('platter_statuses').innerHTML=""; 
    } 
     }, false); 
     }); 
    </script> 
    </div> 
    <label for="platter_status">Platter status</label><br /> 
    <div class="field" id="platter_statuses" > 

    </div> 

现在我有这个然而,问题转移到 - 我怎么能快速地从_form.html.erb为platter_status意见的表格填充此,用的东西全部填满从数据库这应该? 我在其他地方想过,使用一些动态ruby,但我不知道如何传递一个参数(拼盘数和驱动器ID),以便数据库知道如何填充它,而且我不知道知道在@ <%= @SOMETHING_HERE%>之后应该放置什么,以便它解析为platter_status视图...

回答

0

我实际上发现有一个帮助器对我所需要的帮助很大。它是模型中的accep_nested_attributes_for函数。这与196和197的钢轨结合帮助我实现了我想要的。

在hard_drive模型,你应该有一个:

attr_accessible :head_statuses_attributes 
has_many :head_statuses, :dependent => :destroy 
accepts_nested_attributes_for :head_statuses, :allow_destroy => true 

的head_status和platter_status模型。

在视图中,你需要这样一行:

<%= link_to_add_fields "add head status", f, :head_status %> 

和任何标记的部分以外,你需要一个:

<%= link_to_remove_fields "Remove", f %> 

欲了解更多信息,看到这些文章: how accepts_nested_attributes_for works

How the dynamic editing is possible How the dynamic editing is possible part 2