Вложенные поля свойств не отображаются с помощью гема 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
строка добавит пропущенные строки в форму редактирования, если в данный момент их там нет.