嵌套的 属性 字段不显示使用改革 gem
Nested property fields do not show up using the Reform gem
我正在使用 Reform gem 在我当前的项目中创建一个表单对象,但嵌套字段没有显示在表单中。这是我的代码:
发货型号:
class Shipment < ApplicationRecord
has_one :shipment_detail
end
ShipmentDetail 型号:
class ShipmentDetail < ApplicationRecord
belongs_to :shipment
end
改革Class
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
不可见。我应该怎么做才能让它们可见?
在 Reform 中,您需要使用 prepopulator
创建 new/blank :shipment_detail 部分以显示在表单上。
http://trailblazer.to/gems/reform/prepopulator.html
- prepopulators 是在您想要填写字段(又名默认值)或在呈现之前添加嵌套表单的时候。
- 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 并将详细信息部分留空,稍后您希望这些字段出现在编辑操作中,您也需要再次 运行 预填充器在该操作中。就像新动作一样
在我上面的代码中,如果当前有 none,我有 if side_panels.count == 0
行将在编辑表单中添加缺失的行。
我正在使用 Reform gem 在我当前的项目中创建一个表单对象,但嵌套字段没有显示在表单中。这是我的代码:
发货型号:
class Shipment < ApplicationRecord
has_one :shipment_detail
end
ShipmentDetail 型号:
class ShipmentDetail < ApplicationRecord
belongs_to :shipment
end
改革Class
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
不可见。我应该怎么做才能让它们可见?
在 Reform 中,您需要使用 prepopulator
创建 new/blank :shipment_detail 部分以显示在表单上。
http://trailblazer.to/gems/reform/prepopulator.html
- prepopulators 是在您想要填写字段(又名默认值)或在呈现之前添加嵌套表单的时候。
- 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 并将详细信息部分留空,稍后您希望这些字段出现在编辑操作中,您也需要再次 运行 预填充器在该操作中。就像新动作一样
在我上面的代码中,如果当前有 none,我有 if side_panels.count == 0
行将在编辑表单中添加缺失的行。