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:

  1. I Projectscontroller , i new metod, kan du skriva: @todo = @project.todos.build eller @todo = @project.todos.new att instansera ett nytt Todo objekt.

  2. 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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow