I'm having trouble adding children to a given parent. The view has an "Add child" link that passes in the current Person object. From here, I'm stuck. Both the parent and child are Person objects.
Also, the logic is poor - it is currently assumes father.
Model (person.rb):
class Person < ActiveRecord::Base
  has_many :children, :class_name => "Person"
  belongs_to :father, :class_name => "Person", :foreign_key => 'father_id'
  belongs_to :mother, :class_name => "Person", :foreign_key => 'mother_id'
  def children
    Person.find(:all, :conditions => ['father_id=? or mother_id=?', id, id])
  end
end
Controller (people_controller.rb):
class PeopleController < ApplicationController
  # GET /people/new
  # GET /people/new.xml
  def new
    if (params[:parent_id])
      parent = Person.find(params[:parent_id])
      @person = Person.new(:lastname => parent.lastname, :telephone => parent.telephone, :email => parent.email)
      @person.father.build(:father_id => parent.id)
    else
      # create new
      @person = Person.new
    end
    respond_to do |format|
      format.html # new.html.erb
    end
  end
  # POST /people
  # POST /people.xml
  def create
    @person = Person.new(params[:person])
    respond_to do |format|
      if @person.save
        format.html { redirect_to(@person, :notice => 'Person was successfully created.') }
      else
        format.html { render :action => "new" }
      end
    end
  end
end
View (people/_form.html.erb):
<%= link_to "Add Child", {:controller => '/people', :action => :new, :parent_id => @person.id} %>
                The problem here is that right now, you don't actually pass either father_id or mother_id to the "create" action.
The "new" action sets up mother_id/father_id (using build)... but that just means it's there to put into the form on the page... you then have to pass it back to "create" somehow.
Does you form actually contain, say, a hidden field called "father_id" or "mother_id" anywhere?
eg in the template:
<% form_for(@person) do |f| %>
  <%= f.hidden_field :father_id %>
  <%= f.hidden_field :mother_id %>
   #everything else here 
<% end %>
The hidden fields will only return a value if it's already been set (eg you already do this in the controller #new action) if it hasn't, it will correctly come through as nil anyway.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With