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