ネストされたモデル、Projectに属するTaskがあるので、モデルには次のようになります。
class Task < ActiveRecord::Base
belongs_to :project
validates :project_id, :presence => true
私のプロジェクトモデルでは、次のようになっています。
class Project < ActiveRecord::Base
has_many :tasks, :dependent => :destroy
これで、ユーザーがproject_id、つまりタスクが属するプロジェクトを指定できる新しいタスクを作成するためのフォームができました。したがって、私のフォームは次のようになります。
<%= form_for [@project, @task], :remote => true do |f| %>
<%= f.label :title, "Title" %>
<%= f.text_field :title %>
<%= label_tag("Project") %>
<%= select(nil, :project_id, (get_active_projects).collect {|p| [p.title, p.id] }, {:prompt => 'Select Project'}) %>
<%= f.label :description %>
<%= f.text_area :description %>
<div class="actions">
<%= f.submit 'Save' %>
</div>
<% end %>
検証で私が抱えている問題は、ユーザーがフォームでプロジェクト(project_id)を選択しなかった場合、検証を正しく行う前にプロジェクトが見つからないというエラーが表示されることです。プロジェクトを見つけようとする前に、project_idの存在を強制する検証を実行したいと思います。
def create
@project = Project.find(params[:project_id])
@task = @project.tasks.new(params[:task])
@task.update_attributes(:status_id => 2)
@task.save!