fields_for/pseudoattribute approach failing on create parent (b/c parent not saved?)

Hey All,

I'm trying to use the railscasts ep 75 approach to including multiple models on a single form, by using fields_for to load up a pseudoattribute. My 'parent' model is a Project, and the 'child' is a ProjectPerson. It works fine when I'm editing an existing project, but when I'm creating a new project, I get a validation error for each ProjectPerson: "Project can't be blank". I'm guessing that means that the project's id is not getting copied over to the ProjectPerson's project_id, but I'm not sure how to make that happen. I expected it to happen automatically (shouldn't it?), but even if I try to do it myself explicitly (see below) it doesn't seem to work. I'm using rails v2.0.2.

Here is an example of the parameters that my projects/new form hands to the projects/create action:

Parameters:   {"commit"=>"Create"   , "project"=>       {"name"=>"Roys Cool Project"       , "abbreviation"=>"RCP"       , "funding_mechanism"=>""       , "new_research_area_attributes"=>[{"research_area_id"=>""}]       , "grant_number"=>""       , "id"=>""       , "new_project_person_attributes"=>[{"role"=>"Programmer", "person_id"=>"9"}]       , "description"=>""       , "status_id"=>"2"       , "funder_id"=>""       , "start_date(1i)"=>""       , "start_date(2i)"=>""       , "start_date(3i)"=>""       , "end_date(1i)"=>""       , "end_date(2i)"=>""       , "end_date(3i)"=>""}   , "#<ProjectPerson:0x4ad1494>"=>{"role"=>"Programmer"}   , "authenticity_token"=>"08f382d5ec07eecec7cd229ce67664094516ed26"   , "action"=>"create"   , "#<ProjectPerson:0x4ad6a70>"=>{"role"=>"Programmer"}   , "controller"=>"projects"   , "name_search"=>"r"}

Projects/create is scaffold-written--it just does a

  @project = Project.new(params[:project])   respond_to do |format|   if @project.save     flash[:notice] = 'Project was successfully created.'   <<etc.>>

The relevant bits of the project model are:

  class Project < ActiveRecord::Base     has_many :project_person, :dependent => :delete_all        after_update :save_personnell        def new_project_person_attributes=(personnell)       personnell.each do |person|         project_person.build(person)       end     end        def save_personnell       # raise("boobies!")       project_person.each do |p|         p.project_id = id # <-- no effect!         p.save(false)       end     end   end # class Project    Can any of you kind folks advise on how I can fix (or further debug) this problem?

Thanks!

-Roy

Roy Pardee Research Analyst/Programmer Group Health Center For Health Studies (Cancer Research Network) (206) 287-2078 Google Talk: rpardee

Found my problem. I was being anal-retentive, and had put this in my child model (ProjectPerson)

  validates_presence_of :project_id, :person_id

If I comment that out, I can save the parent record no problem. So I guess AR is calling .valid? on the child before trying to save it to the db?

I guess I'll have to ensure I don't get nulls in those fields via db constraints.

Frustrating to have lost so much time to that...

Cheers,

-Roy