我可以在页面的不同部分构建多个对象吗?

Can I build several objects in different parts of a page?

我有一个 Page 模型有很多 TextBlock:

class Page < ApplicationRecord
  has_many :text_blocks, as: :textable, dependent: :destroy
  accepts_nested_attributes_for :text_blocks
end

在可以编辑页面的表单中,我必须在表单的上部显示 3 个文本块,在表单的下部显示 3 个文本块。这是我认为的代码...

上方文本块:

<%= render 'shared/admin/form-fields/text-blocks-form', f: f, number: 3, value: true %>

下方文本块:

<%= render 'shared/admin/form-fields/text-blocks-form', f: f, number: 2, value: false %>

这里是 text-blocks-form 部分:

<div class="form-group">
  <div class="row">
    <div class="col-lg-12 text-blocks">
      <div class="row">
        <% number.times { f.object.text_blocks.where(upper_position: value).build } unless f.object.text_blocks.where(upper_position: value).any? %>
        <%= f.fields_for :text_blocks do |input| %>
          <div class="<%= "col-lg-#{cells(number)}" %>">
            <%= render 'shared/admin/form-fields/text-blocks-fields', f: input, value: value %>
          </div>
        <% end %>
      </div>
    </div>
  </div>
</div>

上面的文本块按预期构建,有3个块但是在表格的下部,有5个块而不是2个。看起来,它只是添加3 + 2。有什么办法可以build 上面描述的文本块?先谢谢了。

我可以很容易地解释为什么你有这个问题,也许不太容易以好的方式解决这个问题。

之所以这样做,是因为在第一个 运行 中创建三个嵌套项(在关联上),然后使用 f.fields_for :text_blocks 迭代它们,在第二个 运行 你再添加两个,然后遍历 f.fields_for :text_blocks 将遍历所有五个创建的块。

一个简单的解决方法是按如下方式更改您的视图:

<div class="form-group">
  <div class="row">
    <div class="col-lg-12 text-blocks">
      <div class="row">
        <% number.times { f.object.text_blocks.where(upper_position: value).build } unless f.object.text_blocks.where(upper_position: value).any? %>
        <%= f.fields_for :text_blocks do |input| %>
          <%- if input.object.upper_position == value %>
            <div class="<%= "col-lg-#{cells(number)}" %>">
              <%= render 'shared/admin/form-fields/text-blocks-fields', f: input, value: value %>
            </div>
          <% end %>
        <% end %>
      </div>
    </div>
  </div>
</div>

如果你总是有 5 个块(3 个在上面,2 个在下面),我也会考虑添加一个 positionorder 列,允许文本块在 re-rendered保存后的正确位置也是如此。