Routing error

I got a routing error when trying to create a note object from inside a
property object:

    Routing Error
    property_url failed to generate from {:action=>"show", :controller=>"properties", :id=>nil}, expected: {:controller=>"properties", :action=>"show"}, diff: {:id=>nil}

Here's what's going on:

    # Show action from the properties controller
    def show
  @property = Property.find(params[:id])
  @note = @property.notes.new
  respond_to do |format|
      format.html
      format.xml { render :xml => @property }
  end
    end

    # Create action from the notes controller
    def create
  @note = Note.new(params[:note])
  @note.user_id = current_user.id
  respond_to do |format|
      if @note.save
    flash[:notice] = 'Note was successfully created.'
    format.html { redirect_to property_path @note.property_id }
    format.xml { render :xml => @note, :status => :created, :location => @note }
      else
    format.html { render :action => "new" }
    format.xml { render :xml => @note.errors, :status => :unprocessable_entity }
      end
  end
    end
    
    # show.html.erb for properties
    <% form_for @note do |f| %>
      <%= f.error_messages %>
      <p>
        <%= f.label 'New note:' %><br />
        <%= f.text_area :text %>
      </p>
      <p>
        <%= f.submit 'Save note' %>
      </p>
    <% end %>

The form displays correctly, but gives a routing error when saving. I'm
not sure what the error is trying to tell me.

This works fine from the console, insofar as I can call
"@note=@property.note.new; @note.save" and have it save successfully.
How can I do it from a view?

Ultimately, the goal is to populate notes linked to the property_id
without resorting to either hidden fields (insecure) or session
variables. I thought a form was the way to go, but I'm really stuck.

The form displays correctly, but gives a routing error when saving. I'm
not sure what the error is trying to tell me.

The error is telling you that you called property_path(nil) - for
whatever reason @note.property_id isn't set.

Fred

Thanks. I had suspected as much, but still found the error rather
opaque. Still, I don't understand *why* it's being unset, since I'm
setting it explicitly in the property controller.

Rather than guessing at why, though, what I'd really like is a reliable
mechanism to populate @note.property_id from the properties
controller--or perhaps from the notes controller if I can somehow get at
the referrer.

Is there a way to call Note.new with arbitrary values?

> The error is telling you that you called property_path(nil) - for
> whatever reason @note.property_id isn't set.

Thanks. I had suspected as much, but still found the error rather
opaque. Still, I don't understand *why* it's being unset, since I'm
setting it explicitly in the property controller.

You're not really - you're setting it in the new method, but not in
the create one (or are you using the nested attributes stuff) ?

Fred

If I call

    @note = @property.notes.new

from the console, it properly populates the property_id and passes it
onto the note object. I've been trying this different ways, and maybe I
don't really understand what's being called when I do it via the web.

At present, I'm calling this from the properties controller, rather than
the notes controller, in the show action (which is where I have embedded
the New Note form). I'm not sure how to do it in notes.new or
notes.create, since I don't understand how to propogate the parent ID to
the notes controller from the property controller that way.

Can you offer a practical snippet for me to try?