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]...
)。您不应该首先手动遍历集合。只需将其传递给 <%= fields_for :drinks, @drinks do |f| %>...
的字段即可。
谢谢马克斯。不一定明白。我需要在表格中发送一系列饮料。使用您的代码不会构建数组并仅发送表单的最后一杯。将我的表单视为要发送到控制器的饮料网格。
【参考方案1】:
我找到了在 [] 中设置 season_id 的解决方法:
<%= fields_for "drinks[#season.id]", record.drink do |f| %>
现在,我所有的饮料都是从表单发送的,即使是具有相同 ID 的饮料。
【讨论】:
以上是关于Rails,fields_for,合并记录的主要内容,如果未能解决你的问题,请参考以下文章
Rails:使用 fields_for 和 check_box
Rails 使用 f.fields_for 和 AJAX 接受_nested_attributes_for