Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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
HTML在构造参数时遵循哪些规则?_Html_Ruby On Rails_Nested Forms_Nested Attributes_Named Parameters - Fatal编程技术网

HTML在构造参数时遵循哪些规则?

HTML在构造参数时遵循哪些规则?,html,ruby-on-rails,nested-forms,nested-attributes,named-parameters,Html,Ruby On Rails,Nested Forms,Nested Attributes,Named Parameters,我正在使用Rails根据一组复杂的嵌套属性自动神奇地创建子对象。因此,我需要以一种非常特殊的方式嵌套参数。显然,我意识到我可以用JS来构建它们,但是我希望表单的顺序能够自动帮助构建。对于上下文,我有两列,由2s表示。每列可以创建新记录或编辑现有记录。当然,当要修改现有记录时,必须传递记录的id 呈现的HTML如下所示: <td width="50%" style="padding-right:3%" class="logistic-details" data-type="logistics

我正在使用Rails根据一组复杂的嵌套属性自动神奇地创建子对象。因此,我需要以一种非常特殊的方式嵌套参数。显然,我意识到我可以用JS来构建它们,但是我希望表单的顺序能够自动帮助构建。对于上下文,我有两列,由2
s表示。每列可以创建新记录或编辑现有记录。当然,当要修改现有记录时,必须传递记录的id

呈现的HTML如下所示:

<td width="50%" style="padding-right:3%" class="logistic-details" data-type="logistics" data-typelogistics="delivery" data-instructions="test instructions" data-id="1" data-amount="20">
  <span class="area-to-inject-amount-inputs" data-object="type_logistics" data-type="logistics" data-typelogistics="delivery">
    <input class="labeler-response" name="type_logistics_attributes[][id]" type="hidden" value="1">
    <input class="labeler-response" name="type_logistics_attributes[][instructions]" type="text" value="test instructions">
  </span>
</td>

<td width="50%" style="padding-right:3%" class="logistic-details" data-type="logistics" data-typelogistics="pickup" data-instructions="" data-id="" data-amount="0">
  <span class="area-to-inject-amount-inputs" data-object="type_logistics" data-type="logistics" data-typelogistics="pickup" data-actioned="charged">
    <input type="hidden" name="type_logistics_attributes[][type_of_logistics]" value="pickup">
    <input class="injected-amount-input" type="number" min="0" max="" placeholder="Amount" name="type_logistics_attributes[][charged_amounts_attributes][][amount]" value="20">
    <span class="area-to-inject-type-of-amount">
      <input type="hidden" name="type_logistics_attributes[][charged_amounts_attributes][][type_of_amount]" value="logistics">
    </span>
    <input class="labeler-response" name="type_logistics_attributes[][instructions]" type="text" placeholder="Enter address and instructions">
  </span>                      
</td>
相反,我得到以下信息:

"type_logistics_attributes"=>[
  {"id"=>"1", "type_of_logistics"=>"pickup", "instructions"=>"test instructions", "charged_amounts_attributes"=>[{"amount"=>"40", "type_of_amount"=>"logistics"}]}, 
  {"instructions"=>"123 Fake street"}
]
不知何故,
边界不起作用,并且子
已收费金额
属性不知何故被集中到第一个
现有记录修改中


谢谢

不是
或任何类似的HTML元素构成输入的“边界”,它只是。提交表单时,浏览器会将
标记中的所有输入作为参数发送。您可能在一个
中有两个列,这就是为什么两个列的参数在
params

中混合的原因。我不确定是否有一种方法可以根据您的需要专门执行此操作,但您可以使params如下所示:

"type_logistics_attributes"=>[
  {"id"=>"1", "instructions"=>"test instructions"},
  {"id"=>"1", "type_of_logistics"=>"pickup", "charged_amounts_attributes"=>[{"amount"=>"40", "type_of_amount"=>"logistics"}], "instructions" => "123 Fake street"}
]
您可以通过在此处添加额外的隐藏输入重复id来实现:

<td width="50%" style="padding-right:3%" class="logistic-details" data-type="logistics" data-typelogistics="pickup" data-instructions="" data-id="" data-amount="0">
  <span class="area-to-inject-amount-inputs" data-object="type_logistics" data-type="logistics" data-typelogistics="pickup" data-actioned="charged">
    <input name="type_logistics_attributes[][id]" type="hidden" value="1">
    <input type="hidden" name="type_logistics_attributes[][type_of_logistics]" value="pickup">
    <input class="injected-amount-input" type="number" min="0" max="" placeholder="Amount" name="type_logistics_attributes[][charged_amounts_attributes][][amount]" value="20">
    <span class="area-to-inject-type-of-amount">
      <input type="hidden" name="type_logistics_attributes[][charged_amounts_attributes][][type_of_amount]" value="logistics">
    </span>
    <input class="labeler-response" name="type_logistics_attributes[][instructions]" type="text" placeholder="Enter address and instructions">
  </span>                      
</td>


Rails有一个处理规则:它在querystring中从左到右(或在HTML中从上到下)获取属性,并在每次看到重复属性时创建一个新对象。

我所知道的唯一方法是,如果为新输入字段提供一些id,则可以以一种形式获取两个参数,但嵌套方式不同。这就是
type\u logistics\u属性
数组元素的区别所在

我也有类似的需求,我用过。当我将它用于与您相同的目的时,它所做的是为新的输入字段提供一个随机id。这就是它的区别


希望这能引导您朝正确的方向前进。

很抱歉,您不确定是否理解了这个问题。我希望两个参数都是一种形式。但是我需要它们的嵌套方式不同于当前的嵌套方式。您可以发布您用于生成此标记的RoR代码吗?您可以向我们提供您的浏览器提交的原始post数据吗?最简单的方法是从浏览器开发工具的“网络”窗格中获取。
<td width="50%" style="padding-right:3%" class="logistic-details" data-type="logistics" data-typelogistics="pickup" data-instructions="" data-id="" data-amount="0">
  <span class="area-to-inject-amount-inputs" data-object="type_logistics" data-type="logistics" data-typelogistics="pickup" data-actioned="charged">
    <input name="type_logistics_attributes[][id]" type="hidden" value="1">
    <input type="hidden" name="type_logistics_attributes[][type_of_logistics]" value="pickup">
    <input class="injected-amount-input" type="number" min="0" max="" placeholder="Amount" name="type_logistics_attributes[][charged_amounts_attributes][][amount]" value="20">
    <span class="area-to-inject-type-of-amount">
      <input type="hidden" name="type_logistics_attributes[][charged_amounts_attributes][][type_of_amount]" value="logistics">
    </span>
    <input class="labeler-response" name="type_logistics_attributes[][instructions]" type="text" placeholder="Enter address and instructions">
  </span>                      
</td>