Nested objects not propagating from view

I thought I had this fixed, but apparently not. It works okay from the
console, but not from the view. I have the following:

  # partial schema
  create_table "users", :force => true do |t|
    t.string "login", :null => false
    t.string "first_name"
    t.string "last_name"
    t.string "email", :null => false
    t.string "password", :null => false
    t.integer "contact_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
  create_table "contacts", :force => true do |t|
    t.string "company_name"
    t.integer "address_id"
    t.integer "phone_areacode", :limit => 3
    t.integer "phone_prefix", :limit => 3
    t.integer "phone_suffix", :limit => 4
    t.integer "phone_extension", :limit => 5
    t.string "website"
    t.integer "biztype_id"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
  create_table "addresses", :force => true do |t|
    t.string "street_address1"
    t.string "street_address2"
    t.string "city"
    t.integer "state_id"
    t.integer "zipcode"
    t.integer "plus4"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

  # relevant models
  class User < ActiveRecord::Base
    belongs_to :contact
    has_many :properties
    has_many :notes, :through => :properties

    accepts_nested_attributes_for :contact, {
  :allow_destroy => true,
  :reject_if => :all_blank
    }
  end
  class Contact < ActiveRecord::Base
    has_one :user
    belongs_to :address
    belongs_to :biztype
    accepts_nested_attributes_for :address, {
  :allow_destroy => true,
  :reject_if => :all_blank
    }
  end
  class Address < ActiveRecord::Base
    has_one :contact
    has_one :property
    belongs_to :state
  end

  # controller
  def new
    @user = User.new
    @user.build_contact.build_address

    respond_to do |format|
      format.html # new.html.erb
      format.xml { render :xml => @user }
    end
  end
  def edit
    @user = User.find(params[:id])
  end

When I run on the console, I can create a new user object with nested
attributes like so:

  >> user=User.new
  => #<User id: nil, login: nil, first_name: nil, last_name: nil, email: nil, password: nil, contact_id: nil, created_at: nil, updated_at: nil>
  >> user.build_contact.build_address
  => #<Address id: nil, street_address1: nil, street_address2: nil, city: nil, state_id: nil, zipcode: nil, plus4: nil, created_at: nil, updated_at: nil>
  >> user.login, user.password, user.email = 'foo', 'bar', 'baz'
  => ["foo", "bar", "baz"]
  >> user.contact.company_name, user.contact.address.city = 'foobar', 'foobaz'
  => ["foobar", "foobaz"]
  >> user.save
  => true
  >> p user, user.contact, user.contact.address
  #<User id: 4, login: "foo", first_name: nil, last_name: nil, email: "baz", password: "bar", contact_id: 2, created_at: "2009-11-06 02:33:41", updated_at: "2009-11-06 02:33:41">
  #<Contact id: 2, company_name: "foobar", address_id: 3, phone_areacode: nil, phone_prefix: nil, phone_suffix: nil, phone_extension: nil, website: nil, biztype_id: nil, created_at: "2009-11-06 02:33:41", updated_at: "2009-11-06 02:33:41">
  #<Address id: 3, street_address1: nil, street_address2: nil, city: "foobaz", state_id: nil, zipcode: nil, plus4: nil, created_at: "2009-11-06 02:33:41", updated_at: "2009-11-06 02:35:09">
  => nil

As you can see, it appears to work fine, but the following views for
new.html.erb and edit.html.erb don't:

  <h1>New account</h1>

  <% form_for(@user) do |f| %>
    <%= f.error_messages %>

    <p> <%= f.label :login %>: <%= f.text_field :login %> </p>
    <p> <%= f.label :first_name %>: <%= f.text_field :first_name %> </p>
    <p> <%= f.label :last_name %>: <%= f.text_field :last_name %> </p>
    <p> <%= f.label :email %>: <%= f.text_field :email %> </p>
    <p> <%= f.label :password %>: <%= f.password_field :password %> </p>
    <% fields_for(@contact) do |f| %>
      <%= f.error_messages %>
      <p> <%= f.label :company_name %>: <%= f.text_field :company_name %> </p>
      <p> <%= f.label :Type_of_Organization %>: <%= f.text_field :biztype_id %> </p>
      <% fields_for(@address) do |f| %>
  <%= f.error_messages %>
  <p> <%= f.label :street_address1 %>: <%= f.text_field :street_address1 %> </p>
  <p> <%= f.label :street_address2 %>: <%= f.text_field :street_address2 %> </p>
  <p> <%= f.label :city %>: <%= f.text_field :city %> </p>
  <p> <%= f.label :state_id %>: <%= f.text_field :state_id, :maxlength=>2 %> </p>
  <p> <%= f.label :zipcode %>: <%= f.text_field :zipcode, :maxlength=>5 %>-<%= f.text_field :plus4, :maxlength=>4 %> </p>
      <% end %>
      <p> <%= f.label :phone %>: (<%= f.text_field :phone_areacode, :maxlength=>3 %>) <%= f.text_field :phone_prefix, :maxlength=>3 %>-<%= f.text_field :phone_suffix, :maxlength=>4 %> Ext. <%= f.text_field :phone_extension, :maxlength=>5 %> </p>
      <p> <%= f.label :website %>: <%= f.text_field :website %> </p>
    <% end %>

    <p> <%= f.submit 'Create' %> </p>
  <% end %>

  <%= link_to 'Back', accounts_path %>

The view doesn't create the additional table entries, nor does it allow
me to edit anything but the unjoined data (e.g. @users, not
@users.contact). Obviously I'm still missing something important here. I
want to be able to both populate *and* edit this content from
similarly-nested views.

Why does this work from the console, but not from within the web app
itself?