Buscar..


Cómo configurar un formulario anidado en Ruby on Rails

Lo primero que hay que tener: un modelo que contiene una relación has_many con otro modelo.

class Project < ApplicationRecord
  has_many :todos
end

class Todo < ApplicationRecord
  belongs_to :project
end

En ProjectsController :

class ProjectsController < ApplicationController
  def new
    @project = Project.new
  end
end

En una forma anidada, puede crear objetos secundarios con un objeto principal al mismo tiempo.

<%= 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 %>

Cuando iniciamos @project con Project.new para tener algo para crear un nuevo objeto Project , de la misma manera para crear un objeto Todo , tenemos que tener algo como esto, y hay varias formas de hacerlo:

  1. En Projectscontroller , en el new método, puede escribir: @todo = @project.todos.build o @todo = @project.todos.new para crear una instancia de un nuevo objeto Todo .

  2. También puede hacer esto en la vista: <%= f.fields_for :todos, @project.todos.build %>

Para parámetros fuertes, puede incluirlos de la siguiente manera:

def project_params
  params.require(:project).permit(:name, todo_attributes: [:name])
end

Dado que, los objetos de Todo se crearán a través de la creación de un objeto de Project , por lo que debe especificar esto en el modelo de Project agregando la siguiente línea:

accepts_nested_attributes_for :todos


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow