如何在 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