HTML表单:POST一个对象数组

csi*_*csi 14 html forms arrays 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"
), 
...  
Run Code Online (Sandbox Code Playgroud)

详情
一位学生:

<input type="text" name="first">  
<input type="text" name="last">  
<input type="text" name="age">  
Run Code Online (Sandbox Code Playgroud)

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

<input type="text" name="students[first][]">  
<input type="text" name="students[last][]">  
<input type="text" name="students[age][]">  
Run Code Online (Sandbox Code Playgroud)

它返回了一系列的第一,持续和年龄

students["first"] = [array of first names]
students["last"] = [array of last names]
students["age"] = [array of ages]  
Run Code Online (Sandbox Code Playgroud)

从理论上讲,我们可以通过访问相同的索引(对每个数组说"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]">  
Run Code Online (Sandbox Code Playgroud)

如果由于任何原因它很重要,我们使用Rails进行视图,但可以使用表单助手或HTML.

mes*_*jah 18

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]">
Run Code Online (Sandbox Code Playgroud)

注意[]后面的空括号()students.这告诉Rack你希望studentsparam是一个数组.遇到的后续参数(具有相同名称)将启动一个新元素.

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"
  }
]}
Run Code Online (Sandbox Code Playgroud)

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


Fah*_*had 10

我知道这个问题很老,但我想为未来的读者添加我的经验.

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

解析数据的方法,如内置serializeArrayserialize未按预期解析它.

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

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

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

我知道虽然这个问题反对这个方法,但是对于那些将在不久的将来降落的PHP用户来说这将是有用的,因为提问者需要Ruby On Rails.

方法你选择硬编码索引是高达你,你可以通过使用清洁方法的JavaScript或者您也可以手动硬鳕鱼最初Ë他们在您的表单元素.

干杯