Rails,fields_for,合并记录

Posted

技术标签:

【中文标题】Rails,fields_for,合并记录【英文标题】:Rails, fields_for, merging records 【发布时间】:2022-01-09 09:07:41 【问题描述】:

我使用fields_for(),不是用于嵌套表单,而是显示包含连接项的表单。我需要显示来自@seasons 的数据,这有助于我灌装饮料...

<% @seasons do |season| %>  
      
   <%= fields_for "drinks[]", season.drink do |f| %>

      ...
      <%= f.select :optimized_region_id ... %>
      ...

   <% end %>
<% end %>

效果很好。 但是,即使 @seasons 永远不会相同,某些 season.drink 也可能是相同的项目,因为它们是“父”关系。 (同季.drink.id) 这对我来说不是问题。

我的问题是表单发送了这个:

drinks"=>
"e80e15c1-a5d4-4df4-80c6-2efa96e39793"=>"optimized_status"=>"1", "optimized_nickname"=>"Alex", 
"b7501fe0-3a78-412e-88d5-e7643d761a98"=>"optimized_status"=>"1", "optimized_nickname"=>"Paul"
...

并且应该发送这个:

drinks"=>
"e80e15c1-a5d4-4df4-80c6-2efa96e39793"=>"optimized_status"=>"1", "optimized_nickname"=>"Alex", 
"e80e15c1-a5d4-4df4-80c6-2efa96e39793"=>"optimized_status"=>"0", "optimized_nickname"=>"Alex", 
"b7501fe0-3a78-412e-88d5-e7643d761a98"=>"optimized_status"=>"1", "optimized_nickname"=>"Paul"
...

在发送表单时,Rails 似乎正在合并具有相同 id 的饮料。是否有可能避免这种情况并发送所有饮料,即使它们具有相同的drink.id ?

【问题讨论】:

在参数对中使用数组 ([]) 对于除了简单值之外的任何东西都不是一个好主意 - 当您传递嵌套对象时,它们将始终发生冲突,因为参数解析器无法区分它们。相反,rails 使用带有键的散列(drinks[0]...drinks[1]...)。您不应该首先手动遍历集合。只需将其传递给 &lt;%= fields_for :drinks, @drinks do |f| %&gt;... 的字段即可。 谢谢马克斯。不一定明白。我需要在表格中发送一系列饮料。使用您的代码不会构建数组并仅发送表单的最后一杯。将我的表单视为要发送到控制器的饮料网格。 【参考方案1】:

我找到了在 [] 中设置 season_id 的解决方法:

<%= fields_for "drinks[#season.id]", record.drink do |f| %>

现在,我所有的饮料都是从表单发送的,即使是具有相同 ID 的饮料。

【讨论】:

以上是关于Rails,fields_for,合并记录的主要内容,如果未能解决你的问题,请参考以下文章

Rails:使用 fields_for 和 check_box

ruby 使用Rails中的fields_for编辑表单

Rails fields_for 表单未显示,嵌套表单

Rails 使用 f.fields_for 和 AJAX 接受_nested_attributes_for

Rails 动态生成的 fields_for 不会被 form_tag 作为输入

Rails:通过许多其他记录获取记录