2010-12-07 10 views
8

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

Respuesta

8

Acabo de revisar su código y esto se ve fantástico para mí. Un pequeño truco:

<%= f.collection_select(:project_id, Project.all, :id, :name) %> 

Esto es sólo un poco más limpio en el que aún utiliza el bloque |f| variables

+1

Gracias! También estaba tratando de descubrir cómo deshacerse de: tarea en esa línea también. – Chanpory

2

Ya que menciona otros enfoques, sin duda lo recomiendo hablar y, de hecho, se utiliza formtastic. Las asociaciones se manejan automáticamente y mantienen su código limpio y también le ofrece algunas excelentes opciones de personalización.

+1

Oh genial, no he probado formtastic. Lo verificará! – Chanpory

Cuestiones relacionadas