【问题标题】:Why the new data are not saved in the nested form?为什么新数据没有以嵌套形式保存?
【发布时间】:2020-05-03 11:19:53
【问题描述】:

在 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 中我首先只添加(保存到 DB)block(第二个块),然后在我向这个 block 添加文本之后,所有两次保存到 DB 都将成功。也就是在单一场景下创建text时缺少block ID造成的问题。

原来这是一个bug?在添加(使用 JS)新的 HTML 表单代码时,还必须添加 block_id 为 text。但现在不是这样。现在只有数据库中现有的块有这个字段。

【问题讨论】:

    标签: ruby-on-rails activeadmin ruby-on-rails-6


    【解决方案1】:

    我记得前段时间我在关联方面遇到了类似的问题。在这里,表单错误看起来文本没有 block_id。这是真的,因为您已经在保存它。试试看:https://api.rubyonrails.org/classes/ActiveRecord/AutosaveAssociation.html

    【讨论】:

      【解决方案2】:

      解决方法很简单——需要使用inverse_of。 Documentation.

      一切都会按预期开始。

      【讨论】:

        猜你喜欢
        • 2014-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        • 2016-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多