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:
Buckblog: Web services, Rails-style.
However, I get the following error:

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

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


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:


  # POST /contacts/people
  # POST /contacts/people.xml
  def create
    company = params[:person].delete(:company)
    @company = Company.find_or_create_by_name(company[:name])
    @person =[:person])

    respond_to do |format|
        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 }
        format.html { render :action => "new" }
        format.xml  { render :xml => @person.errors, :status
=> :unprocessable_entity }



New person

<%= error_messages_for :person %> <% form_tag([:contacts, @person]) do %>

First name
<%= text_field_tag :first_name %>

Last name
<%= text_field_tag :last_name %>

<%= text_field_tag :title %>

<%= text_field_tag "company[name]" %>

<%= submit_tag "Create" %>

<% end %> <%= link_to 'Back', contacts_people_path %>

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


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:

  def create
    company = params[:company]
    @company = Company.find_or_create_by_name(company[:name])
    @person =[:person])

Works like a champ, now. Thanks!

On Oct 1, 3:02 pm, Frederick C. [email protected]