2010-12-07 9 views
8

İki model arasında kurulan bir has_many ve belongs_to derneğim var: Project and Task.Raylar: Yeni bir çocuk kaydı oluştururken varolan bir üst öğe seçmek için form?

Yeni bir Görev oluşturmamı ve varolan bir Projeyi üst öğe olarak atamamı sağlayan bir form oluşturabilmek istiyorum. Örneğin, bu form mevcut projelerin bir listesinden seçim için bir açılanmaya sahip olabilir.

Bu uygulamada yalnızca sonlu bir dizi proje vardır, bu yüzden, bir seed.rb dosyası aracılığıyla Proje kayıtlarını oluşturdum. Yeni projeler oluşturmak için bir form yapmam gerekmiyor.

Yeni Görev formunda bir collection_select form yardımcı etiketi kullanarak bir çözüm elde ettiğime inanıyorum. Şimdi bunun nasıl çalıştığından oldukça memnunum, ancak bu probleme başka yaklaşımlar varsa merak ediyorum.

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

cevap

8

Sadece kodunuzu inceledim ve bu bana harika görünüyor. Bir küçük çimdik:

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

Bu hala diğer yaklaşımlar söz beri, ben kesinlikle formtastic kullanın tavsiye aslında söz ve olurdu

+1

Teşekkürler! Nasıl kurtulacağını da anlamaya çalışıyordum: o satırdaki görev de. – Chanpory

2

değişken |f| blok kullanmakta olduğunuz sadece biraz daha temiz olduğunu. Dernekler otomatik olarak işlenir ve kodunuzu temiz tutar ve ayrıca size bazı harika özelleştirme seçenekleri sunar.

+1

Çok havalı, formtastic almamıştım. Kontrol edecek! – Chanpory

İlgili konular