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, inewmetod, kan du skriva:@todo = @project.todos.buildeller@todo = @project.todos.newatt instansera ett nyttTodoobjekt.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