Почему новые данные не сохраняются во вложенной форме? - PullRequest
0 голосов
/ 03 мая 2020

В 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. Но сейчас это не так. Теперь это поле есть только у существующего блока в базе данных.

1 Ответ

0 голосов
/ 03 мая 2020

Я помню, что когда-то go у меня была похожая проблема с ассоциациями. Здесь, ошибка формы, похоже, что тексты не имеют block_id. Это правда, потому что вы уже сохраняете это. Попробуйте это: https://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...