В ActiveAdmin у меня есть форма редактирования сущностей с тройным вложением. Теперь я могу редактировать данные, которые присутствуют в базе данных. Они сохраняются.
Но если я пытаюсь добавить новые данные, я получаю сообщение об ошибке ROLLBACK:
{:"blocks.texts.block"=>["must exist", "can't be blank"]}
Я уточню еще раз - существующие данные в этом поле успешно обновляется.
Но при создании новой сущности в этой вложенной форме возникает какая-то проблема. Я пытался отслеживать по журналам, что отправляется в форме, что происходит до проверки, а что остается после проверки.
Все приходит в форму:
"blocks_attributes"=>{"0"=>{"texts_attributes"=>{"0"=>{"value"=>"first value", "_destroy"=>"0", "id"=>"671518"}}, "label_ids"=>["", "54"], "_destroy"=>"0", "id"=>"18655"}, "1"=>{"texts_attributes"=>{"0"=>{"value"=>"tteesstt"}}}}
# => "1"=>{"texts_attributes"=>{"0"=>{"value"=>"tteesstt"}}}
Но до и после проверки это данные больше не доступны. В texts
присутствуют только данные, ранее существовавшие.
В ActiveAdmin есть этот код:
permit_params :title, :description, :published,
blocks_attributes: [
:id, :_destroy,
texts_attributes: %i[id value _destroy],
label_ids: []
],
category_ids: []
# ...
f.has_many :blocks, allow_destroy: true do |b_f|
b_f.inputs do
b_f.has_many :texts, allow_destroy: true do |b_t_f|
b_t_f.inputs do
b_t_f.input :value
end
end
b_f.input :labels, as: :check_boxes, collection: Label.options_for_select, input_html: { multiple: true }
end
end
Исходная модель Post имеет такой код:
accepts_nested_attributes_for :blocks,
allow_destroy: true
В Модель блока:
accepts_nested_attributes_for :texts,
allow_destroy: true
Скажите, пожалуйста, почему обновляются существующие данные, а новые исчезают при сохранении?
Добавление 1
Насколько я понимаю, это связано не с texts
, а с block
- blocks.texts.block
. Но почему text
относится к block
? Почему block
не идентифицируется? Он имеет следующее имя в форме: post[blocks_attributes][1][texts_attributes][0][value]
.
Добавление 2
Если в ActiveAdmin я сначала добавляю (сохранить в БД) только block
(второй блок), и после того, как я добавлю текст к этому block
, все два раза сохранение в БД будет успешно. То есть проблема связана с отсутствием идентификатора block
при создании text
в одном сценарии.
Выходит, это ошибка? При добавлении (используя JS) нового кода формы HTML необходимо также добавить block_id
для text
. Но сейчас это не так. Теперь это поле есть только у существующего блока в базе данных.