Вложенные поля свойств не отображаются с помощью гема Reform

Я использую гем Reform для создания объекта формы в моем текущем проекте, но вложенные поля не отображаются в форме. Вот мой код:

Модель отгрузки:

class Shipment < ApplicationRecord
  has_one :shipment_detail
end

Модель отгрузкиДеталь:

class ShipmentDetail < ApplicationRecord
  belongs_to :shipment
end

Реформа Класс

class ShipmentForm < Reform::Form
  property :shipment_type
  property :measure

  property :shipment_detail do
    property :po_number
    property :job_no
  end
end

контроллер

class ShipmentsController < ApplicationController
  def new
    @shipment = ShipmentForm.new(Shipment.new)
  end
end

шаблон

<%= form_for @shipment, url: shipments_path, method: :post do |f| %>
  <%= f.label :shipment_type %><br />
  <%= f.text_field :shipment_type %><br /><br />

  <%= f.label :measure %><br />
  <%= f.text_field :measure %><br /><br />

  <%= f.fields_for :shipment_detail do |d| %>
    <%= d.label :po_number %><br />
    <%= d.text_field :po_number %><br /><br />

    <%= d.label :job_no %>
    <%= d.text_field :job_no %><br /><br />
  <% end %>
<% end %>

Только поля shipment_type а также measure видны на форме, po_number а также job_no не. Что я должен сделать, чтобы сделать их видимыми?

1 ответ

Решение

В реформе вам нужно использовать prepopulator создать новый / пустой: раздел shipment_detail для отображения в форме.

http://trailblazer.to/gems/reform/prepopulator.html

  • Препопуляторы - это когда вы хотите заполнить поля (иначе по умолчанию) или добавить вложенные формы перед рендерингом.
  • populators - это тот код, который запускается непосредственно перед проверкой.

Вот то, что я использовал в своем коде, из которого вы можете получить свою идею:

   collection :side_panels, form: SidePanelForm,
    prepopulator: ->(options) {
      if side_panels.count == 0
        self.side_panels << SidePanel.new(sales_order_id: sales_order_id, collection: sales_order.collection)
      end
    }
  • Препопуляция должна быть вызвана вручную.

     Controller#new
    @shipment_form = ShipmentForm.new(Shipment.new)
    
    @shipment_form.shipment_detail #=> nil
    
    @shipment_form.prepopulate!
    
    @shipment_form.shipment_detail #=> <nested ShipmentDetailForm @model=<ShipmentDetail ..>>
    

RE: форма редактирования

Если вы создаете ShipmentForm в новом действии и оставляете раздел подробностей пустым, а позже вы хотите, чтобы эти поля появлялись в действии редактирования, вам необходимо снова запустить препопуляционные препараты для этого действия. Так же, как новое действие.

В моем коде выше у меня есть if side_panels.count == 0 строка добавит пропущенные строки в форму редактирования, если в данный момент их там нет.

Другие вопросы по тегам