У меня есть очень простое приложение, которое использует вложенную форму для обновления связанных атрибутов.Вот пример двух моделей:
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
с параметрами скриншота.
Например, без данных, я могу видеть это в источнике HTML:
<input type="hidden" value="628" name="finding[screenshots_attributes][0][id]" id="finding_screenshot_attributes_0_id">
но в ту минуту, когда данные применяются, они исчезают.