company = params[:person].delete(:company) nil object error on nil.delete

I am using the Rails 2.0 pre-release and trying to replicate the
method used by Jamis to create a company, person, and then display the
nested xml using .to_xml as shown here:
http://weblog.jamisbuck.org/2006/3/27/web-services-rails-style.
However, I get the following error:

<pre>
  <code>
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.delete
  </code>
</pre>

I can see that all my parameters are passing in correctly from the
form:

<pre>
  <code>
{"company"=>{"name"=>"company"},
"commit"=>"Create",
"title"=>"wacky",
"authenticity_token"=>"7f3e6aaaba34fd8146ce244c2038797ebb1f1593",
"first_name"=>"Ryan",
"last_name"=>"Riley"}
  </code>
</pre>

I was pretty certain this came in as an array, so I'm not sure why I'm
getting an error saying it is not. Here's the relevant controller and
view code:

PeopleController.rb
<pre>
  <code>
  # POST /contacts/people
  # POST /contacts/people.xml
  def create
    company = params[:person].delete(:company)
    @company = Company.find_or_create_by_name(company[:name])
    @person = @company.people.build(params[:person])

    respond_to do |format|
      if @person.save
        flash[:notice] = 'Person was successfully created.'
        format.html { redirect_to(contacts_person_path(@person)) }
        format.xml { render :xml => @person.to_xml( :include =>
@company ), :status => :created, :location => @person }
      else
        format.html { render :action => "new" }
        format.xml { render :xml => @person.errors, :status
=> :unprocessable_entity }
      end
    end
  end
  </code>
</pre>

new.html.erb
<pre>
  <code>
<h1>New person</h1>

<%= error_messages_for :person %>

<% form_tag([:contacts, @person]) do %>
  <p>
    <b>First name</b><br />
    <%= text_field_tag :first_name %>
  </p>

  <p>
    <b>Last name</b><br />
    <%= text_field_tag :last_name %>
  </p>

  <p>
    <b>Title</b><br />
    <%= text_field_tag :title %>
  </p>

  <p>
    <b>Company</b><br />
    <%= text_field_tag "company[name]" %>
  </p>

  <p>
    <%= submit_tag "Create" %>
  </p>
<% end %>

<%= link_to 'Back', contacts_people_path %>
  </code>
</pre>

It doesn't look like your person params are in params[:person] at all
(you're just using text_field_tag :first_name, and so on, which has no
idea that first_name is part of person), so params[:person] is null

Fred

Thanks, Fred. I was using form_for, switched to form_tag, and then
switched back to form_for. Looking more closely at what was sent,
the :company parameter is not part of the :person parameter anyway, so
I just had to change the first line in my controller to:

<pre>
  <code>
  def create
    company = params[:company]
    @company = Company.find_or_create_by_name(company[:name])
    @person = @company.people.build(params[:person])
    ...
  end
  </code>
</pre>

Works like a champ, now. Thanks!