Ruby on Rails
Kapslad form i Ruby on Rails
Sök…
Hur man ställer in ett kapselt formulär i Ruby on Rails
Den första sak att ha: en modell som innehåller en has_many
relation till en annan modell.
class Project < ApplicationRecord
has_many :todos
end
class Todo < ApplicationRecord
belongs_to :project
end
I ProjectsController
:
class ProjectsController < ApplicationController
def new
@project = Project.new
end
end
I en kapslad form kan du skapa barnobjekt med ett överordnat objekt samtidigt.
<%= 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 %>
När vi initialiserade @project
med Project.new
att ha något för att skapa ett nytt Project
objekt, på samma sätt för att skapa ett Todo
objekt, måste vi ha något liknande, och det finns flera sätt att göra det:
I
Projectscontroller
, inew
metod, kan du skriva:@todo = @project.todos.build
eller@todo = @project.todos.new
att instansera ett nyttTodo
objekt.Du kan också göra detta i vyn:
<%= f.fields_for :todos, @project.todos.build %>
För starka params kan du inkludera dem på följande sätt:
def project_params
params.require(:project).permit(:name, todo_attributes: [:name])
end
Sedan kommer Todo
objekten att skapas genom skapandet av ett Project
, så du måste ange det här i Project
genom att lägga till följande rad:
accepts_nested_attributes_for :todos