如何在 Ruby on Rails 中設定巢狀表單

第一個要做的事情:一個包含與另一個模型的 has_many 關係的模型。

class Project < ApplicationRecord
  has_many :todos
end

class Todo < ApplicationRecord
  belongs_to :project
end

ProjectsController

class ProjectsController < ApplicationController
  def new
    @project = Project.new
  end
end

在巢狀表單中,你可以同時使用父物件建立子物件。

<%= nested_form_for @project do |f| %>
  <%= f.label :name %>
  <%= f.text_field :name %>

  <% # Now comes the part for `Todo` object %>
  <%= f.fields_for :todo do |todo_field| %>
    <%= todo_field.label :name %>
    <%= todo_field.text_field :name %>
  <% end %>
<% end %>

當我們用 Project.new 初始化 @project 以建立一個新的 Project 物件時,建立一個 Todo 物件的方式相同,我們必須有這樣的東西,並且有多種方法可以做到:

  1. Projectscontroller 中,在 new 方法中,你可以編寫:@todo = @project.todos.build@todo = @project.todos.new 來例項化一個新的 Todo 物件。

  2. 你也可以在檢視中執行此操作:<%= f.fields_for :todos, @project.todos.build %>

對於強 params,你可以通過以下方式包含它們:

def project_params
  params.require(:project).permit(:name, todo_attributes: [:name])
end

因為,Todo 物件將通過建立 Project 物件來建立,所以你必須通過新增以下行在 Project 模型中指定這個東西:

accepts_nested_attributes_for :todos