Могу ли я построить несколько объектов в разных частях страницы? - PullRequest
0 голосов
/ 10 июля 2019

У меня есть модель 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 текстовых блоков, как это было описано выше?Спасибо вперед.

1 Ответ

1 голос
/ 10 июля 2019

Я могу легко объяснить, почему у вас есть эта проблема, может быть, немного легче исправить это хорошим способом.

Причиной этого является то, что в первом запуске вы создаете три вложенных элемента (в ассоциации), а затем перебираете их, используя 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 снизу), я бы также подумал о добавлении столбца position или order, что позволило бы заново отображать текстовые блоки в правильном положении после сохранения.

...