簡體   English   中英

在Rails中嵌套兩層深度,用於選擇種子對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM