Ruby on Rails
Forma anidada en Ruby on Rails
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:
En
Projectscontroller
, en elnew
método, puede escribir:@todo = @project.todos.build
o@todo = @project.todos.new
para crear una instancia de un nuevo objetoTodo
.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