【问题标题】:HTML Form: POST an array of objectsHTML 表单:发布一组对象
【发布时间】:2016-03-22 16:27:39
【问题描述】:

提交班级名册。一次添加 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。

【问题讨论】:

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


    【解决方案1】:

    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&amp;students[][last]=bar&amp;students[][age]=21&amp;students[][first]=baz&amp;students[][last]=qux&amp;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

    【讨论】:

    • 我不知道 Flask 是什么,但可能不是。这个答案是特定于 Ruby on Rails 的。
    • 我正在使用 Rails4。这种方法使用所有学生信息正确地发出 HTTP POST 请求(正如我从 chrome 网络检查器确认的那样)。但是在controller.create 方法中(使用binding.pry),当我看到params 时,它显示了一个学生数组,但其中只包含一个散列 - 只有最后一个学生的散列 - 以前的学生在参数中丢失了。我在这里做错了什么?
    • 对于那些使用 Django 和 DRF 的人,所需的格式是 students[0]first(没有点,唯一,指定索引),我终于在这里找到了:stackoverflow.com/a/57013811/3507333
    【解决方案2】:

    我知道这个问题很老了,但我想补充一下我的经验 也适合未来的读者。

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

    内置serializeArrayserialize等解析数据的方法也没有按预期解析。

    这是我迄今为止尝试过的......

    • students[name]
    • students[][name] - 很奇怪,因为它是为了自动索引数组
    • students[name][]

    它们都不起作用,但这个 students[&lt;hardcoded-index&gt;][name]PHP 工作,

    我知道虽然问题是针对这种方法的,但它 对即将登陆这里的 PHP 用户很有用 因为提问者在 Ruby On Rails 中需要它。

    您选择对索引进行硬编码的方法由您决定,您可以使用 javascript 使用更简洁的方法,也可以手动硬编码 strong>最初将它们放在您的表单元素中。

    干杯

    【讨论】:

    • 这很有趣。这是否意味着围绕这个特定任务的困难不是特定于 Rails 的事情,而是 HTML 的事情?
    • 没错! - 但我相信这个问题现在已经解决了,或者至少有一个比这个更漂亮的解决方法:D
    • 我希望如此,这对我来说有点困惑,但仍然有很大的帮助。如果您知道我有任何更新的技术,请分享链接
    猜你喜欢
    • 2018-08-27
    • 2015-09-27
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 2013-09-06
    • 2021-08-21
    相关资源
    最近更新 更多