[英]Nested form two levels deep in Rails for selecting seeded objects
我試圖建立一個嵌套形式的形式,深入兩層 。 這是關於創建一個工廠。 第一級和第二級都是collection_check_boxes
用於選擇種子對象。
言語關系
到了第一級,我讓它工作,具體地說,它暫時看起來像:
工廠有許多機器 ,通過把手 。
然后我想以相同的形式為機器添加關聯:
機器有許多材料 ,通過飼料 。
工廠模型看起來像:
validates :name, presence: true
validates :description, presence: true
# Factory to handle machines.
has_many :handles, :dependent => :destroy
has_many :machines, :through => :handles
# Factory needs to know about materials (fed through machines).
accepts_nested_attributes_for :machine
機器模型從邏輯上推導出來,但當然沒有材料的嵌套屬性。 (材料是這里的終點。)
然后控制器部分為表單創建工廠(factory_controller.rb):
def factory_params
params.require(:factory).permit(:name, :description,
:machine_ids => [], machines: [:material_ids => [] ])
end
@materials
也存在於相關行動中。
表格如下:
<div class="w3-row">
<div class="w3-twothird" style="margin-left: 16.65%">
<%= simple_form_for @factory do |f| %>
<!-- Input -->
<%= f.input_field :name %>
<%= f.label :name %>
<%= f.error :name %>
<%= f.input_field :description, rows: 7 %>
<%= f.label :description %>
<%= f.error :description %><br><br>
<div class="w3-row w3-margin-top">
<!-- Machines card -->
<div class="w3-third w3-card w3-padding-bottom">
<h5 class="w3-text-teal w3-center">Machines</h5>
<ul class="w3-ul" id="machines">
<%= f.collection_check_boxes :machine_ids, @machines, :id, :name do |b| %>
<li>
<%= b.label do %>
<%= b.check_box class: "w3-check" %>
<%= b.text %>
<% end %>
</li>
<% end %>
</ul>
</div>
<!-- Materials card -->
<div class="w3-third w3-card w3-padding-bottom">
<h5 class="w3-text-teal w3-center">Machines</h5>
<ul class="w3-ul" id="materials">
<%= f.collection_check_boxes :material_ids, @materials, :id, :sort do |b| %>
<li>
<%= b.label do %>
<%= b.check_box class: "w3-check" %>
<%= b.text %>
<% end %>
</li>
<% end %>
</ul>
</div>
</div>
<br><br>
<!-- Zenden -->
<div class="w3-center w3-margin-bottom">
<%= f.button :button, class: "w3-btn w3-blue w3-center" %>
</div>
<% end %>
</div>
</div>
對不起所有超級無關的CSS。
我的規格說:
Users can create new factory with associated materials on the associated machines
Failure/Error: <%= b.check_box class: "w3-check" %>
ActionView::Template::Error:
undefined method `material_ids' for #<Factory:0x007fb3f41fbad0>
You should use fields_for method to manage associated fields in a form,
try below code :
<div class="w3-row">
<div class="w3-twothird" style="margin-left: 16.65%">
<%= simple_form_for @factory do |f| %>
<!-- Input -->
<%= f.input_field :name %>
<%= f.label :name %>
<%= f.error :name %>
<%= f.input_field :description, rows: 7 %>
<%= f.label :description %>
<%= f.error :description %><br><br>
<div class="w3-row w3-margin-top">
<!-- Machines card -->
<div class="w3-third w3-card w3-padding-bottom">
<h5 class="w3-text-teal w3-center">Machines</h5>
<ul class="w3-ul" id="machines">
<%= f.collection_check_boxes :machine_ids, @machines, :id, :name do |b| %>
<li>
<%= b.label do %>
<%= b.check_box class: "w3-check" %>
<%= b.text %>
<% end %>
</li>
<% end %>
</ul>
</div>
<!-- Materials card -->
<% f.fields_for @machines do |ff| %>
<div class="w3-third w3-card w3-padding-bottom">
<h5 class="w3-text-teal w3-center">Machines</h5>
<ul class="w3-ul" id="materials">
<%= ff.collection_check_boxes :material_ids, @materials, :id, :sort do |b| %>
<li>
<%= b.label do %>
<%= b.check_box class: "w3-check" %>
<%= b.text %>
<% end %>
</li>
<% end %>
</ul>
</div>
<% end %>
</div>
<br><br>
<!-- Zenden -->
<div class="w3-center w3-margin-bottom">
<%= f.button :button, class: "w3-btn w3-blue w3-center" %>
</div>
<% end %>
</div>
</div>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.