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

时间:2019-07-10 10:45:37

标签: ruby-on-rails cocoon-gem

我有一个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。{{ 1}}如上所述的文本块?谢谢你。

1 个答案:

答案 0 :(得分:1)

我可以很容易地解释您为什么会遇到此问题,以好的方式解决此问题可能要容易一些。

之所以这样,是因为在第一次运行中您创建了三个嵌套项(在关联上),然后使用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列,以允许文本块在之后以正确的位置重新呈现保存。

相关问题