Ruby on Rails
Modulo annidato in Ruby on Rails
Ricerca…
Come configurare un modulo annidato in Ruby on Rails
La prima cosa da avere: un modello che contiene una relazione has_many
con un altro modello.
class Project < ApplicationRecord
has_many :todos
end
class Todo < ApplicationRecord
belongs_to :project
end
In ProjectsController
:
class ProjectsController < ApplicationController
def new
@project = Project.new
end
end
In un modulo annidato, è possibile creare oggetti figlio con un oggetto genitore allo stesso tempo.
<%= 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 %>
Come abbiamo inizializzato @project
con Project.new
per avere qualcosa per creare un nuovo oggetto Project
, allo stesso modo per creare un oggetto Todo
, dobbiamo avere qualcosa di simile, e ci sono diversi modi per farlo:
In
Projectscontroller
, in unnew
metodo, puoi scrivere:@todo = @project.todos.build
o@todo = @project.todos.new
per istanziare un nuovo oggettoTodo
.Puoi anche farlo in vista:
<%= f.fields_for :todos, @project.todos.build %>
Per i parametri forti, puoi includerli nel modo seguente:
def project_params
params.require(:project).permit(:name, todo_attributes: [:name])
end
Poiché, gli oggetti Todo
verranno creati mediante la creazione di un oggetto Project
, quindi devi specificare questa cosa nel modello Project
aggiungendo la seguente riga:
accepts_nested_attributes_for :todos