редактирование нескольких дочерних записей при доступе к значениям других атрибутов указанной записи - PullRequest
0 голосов
/ 12 ноября 2019

Для класса

class Product
  has_many :productunits
  accepts_nested_attributes_for :productunits

class Productunit 
  belongs_to :product
  belongs_to :unit

  validates :product_id, presence: true
  validates :unit_id, presence: true

следующая форма предназначена только для обновления существующих записей (то есть фактически таблиц объединения) при форматировании полей в столбцах (один столбец наchild) и влияние некоторой логики представления на то, должно ли поле отображаться или нет.

<div class='grid-x grid-margin-x'>
  <%= f.fields_for :productunits do |price_fields| %>
    <div class='cell small-2 text-right'>
      <h4><%# productunit.unit.name %> </h4>
      <%# if productunit.unit.capacity == 2 %
      2 <%= label %> <%= price_fields.number_field :price2 %>
      <%# end %>
    </div>
  <% end %>
</div>

Однако возникает ряд проблем:

  1. Я не могу вызвать значение атрибутаредактируемой записи (скажем, productunit.unit.capacity)
  2. Естественный разрыв дочерних записей недоступен тегам HTML для форматирования (<div class='cell [...]). Хуже того, rails выбрасывает идентификатор дочерней записи вне определения div </div> <input type="hidden" value="3" name="product[productunits_attributes][1][id]" id="product_productunits_attributes_1_id" /> <div class='cell small-2 text-right'>
  3. отправка формы возвращает ошибку Productunits unit can't be blank, которая будет приемлема для новой записи, но определенно не ожидается при редактировании существующей. .

К сожалению, направляющая для направляющих тонкая в этом отношении.

1 Ответ

1 голос
/ 12 ноября 2019
  1. Я не могу вызвать значение атрибута редактируемой записи записи

Вы можете получить объект, обернутый построителем форм или конструктором ввода через метод объекта:

<div class='grid-x grid-margin-x'>
  <%= f.fields_for :productunits do |price_fields| %>
    <div class='cell small-2 text-right'>
      <h4><%= price_fields.object.unit.name %> </h4>
      <% if price_fields.object.unit.capacity == 2 %
      2 <%= price_fields.label :price2 %> <%= price_fields.number_field :price2 %>

      <% end %>
    </div>
  <% end %>      
</div>

2 Естественный разрыв в дочерних записях недоступен тегам html для форматирования ...

fields_for просто перебирает дочерние записи. Это просто петля. Я предполагаю, что вы только что испортили html как блуждающий тег </div> или что-то, что вы делаете с <%= label %>.

, отправив форму, выдает ошибку. быть справедливым в отношении новой записи, но определенно не ожидается при редактировании существующей.

Вы не передаете идентификатор для устройства. Rails не делает это автоматически. Либо используйте скрытый ввод, либо помощники по сбору.

<div class='grid-x grid-margin-x'>
  <%= f.fields_for :productunits do |price_fields| %>
    <div class='cell small-2 text-right'>
      <h4><%= price_fields.object.unit.name %> </h4>
      <% if price_fields.object.unit.capacity == 2 %
      2 <%= price_fields.label :price2 %> <%= price_fields.number_field :price2 %>
      <% end %>
      <%= price_fields.collection_select(:unit_id, Unit.all, :id, :name) %> 
      # or
      <%= price_fields.hidden_field(:unit_id) %> 
    </div>
  <% end %>      
</div>

В примечании вы должны указать свою модель ProductUnit, таблицу product_units и использовать product_unit везде. См. Руководство по стилю Ruby .

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