HTML表单:POST一个对象数组

时间:2015-12-16 13:43:59

标签: html arrays forms ruby-on-rails-4

提交课程名单。一次添加3名学生。每个学生都有第一个,最后一个,年龄。

问题:我们怎样才能让所有学生都在数组中?

students[0] => Array (
  ["first"] => "first name for 0",
  ["last"] => "last name for 0",
  ["age"] => "age for 0"
),
students[1] => Array (
  ["first"] => "first name for 1",
  ["last"] => "last name for 1",
  ["age"] => "age for 1"
), 
...  

详情
对于一个学生:

<input type="text" name="first">  
<input type="text" name="last">  
<input type="text" name="age">  

我们可以在这样的单独数组中返回多个学生:

<input type="text" name="students[first][]">  
<input type="text" name="students[last][]">  
<input type="text" name="students[age][]">  

返回第一,数组和年龄的数组

students["first"] = [array of first names]
students["last"] = [array of last names]
students["age"] = [array of ages]  

理论上,我们可以通过访问相同的索引来获取学生的所有信息(对每个数组说“3”)。

我们不希望以编程方式在表单中添加索引 不想要:

<input type="text" name="students[hardcoded_index][first]">  
<input type="text" name="students[hardcoded_index][last]">  
<input type="text" name="students[hardcoded_index][age]">  

如果出于任何原因这很重要,我们将Rails用于视图,但可以使用表单助手或HTML。

2 个答案:

答案 0 :(得分:16)

tl; dr:在[]之后将空括号(students)添加到输入名称。

摆弄Rack::Utils.parse_nested_query似乎你可以得到你想要的有效载荷:

<!-- first student -->
<input type="text" name="students[][first]">
<input type="text" name="students[][last]">
<input type="text" name="students[][age]">

<!-- second student -->
<input type="text" name="students[][first]">
<input type="text" name="students[][last]">
<input type="text" name="students[][age]">

请注意[]之后的空括号(students)。这告诉Rack您希望students参数为数组。遇到的后续参数(具有相同名称)将启动一个新元素。

POST /myroute?students[][first]=foo&students[][last]=bar&students[][age]=21&students[][first]=baz&students[][last]=qux&students[][age]=19

获取解析如下:

{"students" => [
  {
    "first" => "foo",
     "last" => "bar",
      "age" => "21"
  },
  {
    "first" => "baz",
     "last" => "qux",
      "age" => "19"
  }
]}

进一步阅读:http://codefol.io/posts/How-Does-Rack-Parse-Query-Params-With-parse-nested-query

答案 1 :(得分:6)

  

我知道问题已经过时了,但我想补充一下我的经验   也是为了未来的读者。

对于那些想要在PHP环境中处理数据的人, @ messanjah的方法不起作用,

解析数据的方法(如内置serializeArrayserialize)也未按预期解析。

这是我到目前为止所尝试的......

  • students[name]
  • students[][name] - 非常奇怪,因为它意味着自动索引数组
  • students[name][]

它们都没有用,但这个students[<hardcoded-index>][name]适用于 PHP

  

我知道虽然问题是反对这种方法,但它   对于将在不久的将来降落的PHP用户非常有用   因为提问者需要Ruby On Rails。

您选择对代码进行硬编码的方法取决于您,您可以使用 javascript 来使用更干净的方法,也可以手动硬编码 e最初是在你的表单元素中。

干杯