Tengo una asociación has_many y belongs_to configurada entre dos modelos: Proyecto y Tarea.Rieles: ¿forma para seleccionar un padre existente al crear nuevos registros secundarios?
Me gustaría poder crear un formulario que me permita crear una nueva tarea y asignar un proyecto existente como primario. Por ejemplo, este formulario puede tener un menú desplegable para seleccionar de una lista de proyectos existentes.
Solo hay un conjunto finito de proyectos disponibles en esta aplicación, así que he creado los registros del proyecto a través de un archivo seeds.rb. No necesito hacer un formulario para crear nuevos proyectos.
Creo que he logrado una solución mediante el uso de una etiqueta auxiliar de formulario collection_select
en el nuevo formulario de Tarea. Estoy bastante contento con cómo funciona esto ahora, pero me da curiosidad si hay otros enfoques para este problema.
#models/project.rb
class Project < ActiveRecord::Base
has_many :tasks, :dependent => :destroy
end
#models/task.rb
class Task < ActiveRecord::Base
belongs_to :project
end
#controllers/tasks_controller.rb
class TasksController < ApplicationController
def new
@task = Task.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @task }
end
end
def create
@task = Task.new(params[:task])
respond_to do |format|
if @task.save
format.html { redirect_to(@task, :notice => 'Task was successfully created.') }
format.xml { render :xml => @task, :status => :created, :location => @task }
else
format.html { render :action => "new" }
format.xml { render :xml => @task.errors, :status => :unprocessable_entity }
end
end
end
end
#views/new.html.erb
<h1>New task</h1>
<%= form_for(@task) do |f| %>
<div class="field">
<%= f.label :name %><br />
<%= f.text_field :name %>
</div>
<div class="select">
<%= collection_select(:task, :project_id, Project.all, :id, :name) %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
<%= link_to 'Back', tasks_path %>
Gracias! También estaba tratando de descubrir cómo deshacerse de: tarea en esa línea también. – Chanpory