2010-12-07 3 views
8

私はhas_manyとbelongs_toの関連付けをProjectとTaskという2つのモデルの間に設定しました。Rails:新しい子レコードを作成するときに既存の親を選択するためのフォーム?

新しいタスクを作成して既存のプロジェクトを親として割り当てることができるフォームを作成したいと考えています。たとえば、このフォームには既存のプロジェクトのリストから選択するためのプルダウンがあります。

このアプリケーションでは有限のプロジェクトしか使用できないため、seeds.rbファイルを使用してプロジェクトレコードを作成しました。私は新しいプロジェクトを作成するためのフォームを作る必要はありません。

私は新しいタスクフォームにcollection_selectフォームヘルパータグを使用して解決策を達成したと思います。私はこれが今どのように機能しているのかとても満足していますが、この問題に対する他のアプローチがあるかどうか不思議です。

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

答えて

8

私はちょうどあなたのコードを見直しました。これは私にとって素晴らしいものです。一つの小さな微調整は:

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

これは、あなたがまだあなたが他のアプローチを述べたので、私は間違いなくあなたはformtasticを使用し、お勧めします実際には言及してしまう

+1

ありがとうございます!その行のタスクも取り除く方法を理解しようとしていただけです。 – Chanpory

2

変数|f|ブロックを使用しているという点で、わずかにクリーナーです。この関連付けは自動的に処理され、コードをきれいに保ちます。また、いくつかの優れたカスタマイズオプションを提供します。

+1

ああ、私はformtasticを持っていない。それをチェックします! – Chanpory

関連する問題