Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 具有多个相同键名的嵌套表单_Ruby On Rails_Ruby_Nested Forms - Fatal编程技术网

Ruby on rails 具有多个相同键名的嵌套表单

Ruby on rails 具有多个相同键名的嵌套表单,ruby-on-rails,ruby,nested-forms,Ruby On Rails,Ruby,Nested Forms,我正在尝试将以下参数转换为Rails表单 {:routine=>{ :name=>"Test"}, :arbitrary=>[ {:lift=>{ :exercise_id=>"1", :infos=>[ {:weight=>"250", :repetiton=>"8"}, {:weight=>"275", :repetition=>"6"} ]

我正在尝试将以下参数转换为Rails表单

{:routine=>{
 :name=>"Test"}, 
  :arbitrary=>[
   {:lift=>{
    :exercise_id=>"1", 
    :infos=>[
     {:weight=>"250", :repetiton=>"8"}, 
     {:weight=>"275", :repetition=>"6"}
            ]
           }
   },
   {:lift=>{
    :exercise_id=>"2", 
    :infos=>[
     {:weight=>"405", :repetition=>"12"}, 
     {:weight=>"445", :repetition=>"4"}
            ]
           }
   }
              ]
} 
在学习了如何在rails中正确设置表单之后,我意识到在开始构建表单之前决定我希望参数是什么非常有帮助。我在身体的早期阶段遇到了一个问题

在上面的参数中,我们有一个具有名称的例程。那套套路有很多升降机,是套路和练习之间的连接。在“选择”字段中,我试图让用户从exercise.all中选择一个练习,并将exercise的实例设置为exercise\u id,以便与例程\u id一起创建提升。每部电梯都将有许多装置(如上图所示参数中的信息,rails不允许我使用该装置),这些装置具有重量和重复次数

在我目前拥有的简短形式中,我选择的最后一个练习是在参数中传递的唯一练习。我猜是因为在指定质量时,第一个:提升被第二个:提升覆盖,依此类推。这是我目前的表格

<%= form_tag routines_path %>

<%= label_tag "routine[name]", "Routine Name" %>
<%= text_field_tag "routine[name]" %><br />

<%= select("arbitrary[][lift]", "exercise_id", Exercise.all.collect {|p| [ p.name, p.id] }) %><br />

<%= select("arbitrary[][lift]", "exercise_id", Exercise.all.collect {|p| [ p.name, p.id] }) %>

<%= submit_tag "Submit Routine" %>



是否有一种方法可以实现这些参数,或者我通常选择了错误的参数。我猜,如果每一个:lift都被称为不同的东西,它会起作用,但不是我想做的。感谢所有能提供帮助的人。

如果您知道要创建多少个“任意”,可以使用循环创建它们

<% 0...@maximum.each do |current_count|%>
  <%= select("arbitrary[][lift][#{current_count}][]", "exercise_id", Exercise.all.collect {|p| [ p.name, p.id] }) %><br />
<% end %>


每个参数都有一个唯一的编号,因此它们将创建可以迭代的单独参数集


在呈现表单之前,您只需设置@maximum。

如何设置“任意[][lift][1][]”和“任意[][lift][2][]”?当我给出表单“任意[][lift[1]”和[2]时对于下一个领域,它是有效的。问题是,我希望用户动态添加他们选择的不同练习,这将使这种硬编码更具挑战性,但这是一个很好的起点。是否有一种方法可以动态更改此处的数字[][lift][1][]?那么,每次用户通过Ajax说“另一个任意的,请?”时,您都要添加一个分部吗?然后您可以使用会话变量来构建它。您可以使用类似于……的功能,然后只需在循环中使用| k,v |就可以了