首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HTML在构造参数时遵循什么规则?

HTML在构造参数时遵循什么规则?
EN

Stack Overflow用户
提问于 2016-06-04 07:28:17
回答 2查看 260关注 0票数 16

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

呈现的HTML如下所示:

代码语言:javascript
复制
<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>

在本例中,第一个<td>修改一个id为1的现有记录,而第二个<td>提供创建新记录的参数。创建新记录时,也会创建子charged_amounts。因此,这些参数是我所期望的:

代码语言:javascript
复制
"type_logistics_attributes"=>[
  {"id"=>"1", "instructions"=>"test instructions"},
  {"type_of_logistics"=>"pickup", "charged_amounts_attributes"=>[{"amount"=>"40", "type_of_amount"=>"logistics"}], "instructions" => "123 Fake street"}
]

相反,我得到了以下内容:

代码语言:javascript
复制
"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"}
]

不知何故,<td>边界不起作用,子charged_amount属性以某种方式被集中到第一个<td>现有记录修改中。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-07-25 21:16:33

据我所知,您可以在一个表单中获得两个参数,但嵌套方式不同的唯一方法是,如果您为新的输入字段提供一些id。这就是区分type_logistics_attributes数组元素的原因。

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

希望这篇文章能把你引向正确的方向。

票数 2
EN

Stack Overflow用户

发布于 2016-06-15 16:37:51

我不确定有没有一种方法可以按照你想要的那样做,但你可以让params看起来像这样:

代码语言:javascript
复制
"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来实现:

代码语言:javascript
复制
<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有一个处理这个问题的规则:它在查询字符串中从左到右获取属性(或者在HTML中从上到下),并在每次看到重复的属性时创建一个新对象。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37624829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档