我有一个非常基本的应用程序,该应用程序使用嵌套表单来更新其关联的属性。这是两个模型的示例:
class Screenshot < ApplicationRecord
belongs_to :finding
end
。
class Finding < ApplicationRecord
has_many :screenshots
accepts_nested_attributes_for :screenshots, update_only: true
end
,因此在FindingController中,我将其底部放在其参数中:
def finding_params
params.require(:finding).permit(:name, :screenshots_attributes => {})
end
这是允许用户更改屏幕截图文本的表格。
<table>
<thead>
<tr>
<th><%= check_box_tag "checked_screenshot", 0, false %></th>
<th>Screenshot Name</th>
</tr>
</thead>
<tbody>
<%= form.fields_for :screenshots do |screenshot| %>
<tr>
<td>
<%= check_box_tag "checked_screenshot[]", screenshot.object.id, false %>
</td>
<td>
<%= screenshot.collection_select :name, ['New','Random2','Random2','Low','Informational'], :to_s, :to_s, {class: "form-control"} %>
</td>
</tr>
<% end %>
</tbody>
</table>
如此简单,用户可以从下拉框中选择一个名称,该名称应用于更新与发现相关联的屏幕截图的名称。但是,不是将名称从New
更改为Random2
,而是仅使用名称screenshot
为Random2
创建了一条新记录,而不是更新完成的关联。此时,Finding
现在有两个屏幕截图,而不是一个。
我以前从没有回想过这个问题,但是我不确定在这里是否做错了什么。
编辑
随着我在分辨率方面取得更大的进步,看来我的问题在某种程度上与该数据表有关。如果我避免初始化数据表,那么它将起作用并包含一个ID并按预期更新屏幕快照名称。我将datatable类添加回它的那一刻,它停止工作,并且在屏幕截图参数中不包含id
参数。
例如,没有数据表,我可以在HTML源代码中看到它:
<input type="hidden" value="628" name="finding[screenshots_attributes][0][id]" id="finding_screenshot_attributes_0_id">
但是一旦应用了数据表,它就会消失。