如何在 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
对象的方式相同,我们必须有这样的东西,并且有多种方法可以做到:
-
在
Projectscontroller
中,在new
方法中,你可以编写:@todo = @project.todos.build
或@todo = @project.todos.new
来实例化一个新的Todo
对象。 -
你也可以在视图中执行此操作:
<%= 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