Error: "Couldn't find Contact without an ID" -> form_tag parameter confusion

I Try to Add to one of my Group objects a Contact object
My model looks simplified like this:

Group has a Contacts
Contact has a Group
Contact has a City
City is owned by Contacts

I hope thats understandable.

My Form:
<% for column in Group.content_columns %>
  <b><%= column.human_name %>:</b> <%=h @group.send( %>
<% end %>

<%= link_to 'Edit', :action => 'edit', :id => @group %> |
<%= link_to 'Back', :action => 'list' %>


<% for contact in @group.contacts %>
  <%= contact.first %><br/>
  <%= %><br/>
  <%= contact.adress %>
  <hr />
<% end %>

<%= form_tag :action => "contact", :id => @group, : %>
  <span>First: </span><%= text_field "contact", "first" %>
  <span>Last: </span><%= text_field "contact", "name" %>
  <span>Adress: </span><%= text_field "contact", "adress" %>
  <span>City: </span><%= text_field "contact", "city_name" %>
  <%= submit_tag "Add contact!" %>

in the controller the method looks like this:
def contact
    newContact = Group.find(params[:id]).contacts.create
    newContact.first = params[:first] = params[:name] = params[:adress]
    existingCity = City.find_on_conditions(:all, :name =>

    if (existingCity[0] != nil) then = existingCity[0]
    else = City.create = params(:city_name)

    flash[:notice] = "Added your new contact."
    redirect_to :action => "show", :id => params[:id]

the following ErrorMessage reads like this:
"Couldn't find Contact without an ID"

Its probably a really stupid mistake. I started Ruby 2 days before so
be gentle :wink:
Thanks in Advance


I'm a beginner, just like you, but I hope my experience will help.
After getting the same error message on my code (purely Rails/scaffold-
generated RHTML for now), I was able to find a few bits of answers on
various forums. This is what I did (my primary key field is named

In the controller, I replaced all calls to find(params[:id]) with
calls to find_by_code(params[:code]). This function was generated by
Rails, I guess when I declared [set_primary_key "code"] in the model.

  def show
    #@rv_wrk_consult_type = RvWrkConsultType.find(params[:id])
    # Finding by "CODE":
    @rv_wrk_consult_type =

In the views, I replaced ":id" with ":code". Example:

    <!-- Replaced ":id" below with ":code" -->
    <td><%= link_to 'Show', :action => 'show', :code =>
rv_wrk_consult_type %></td>
    <td><%= link_to 'Edit', :action => 'edit', :code =>
rv_wrk_consult_type %></td>
    <td><%= link_to 'Destroy', { :action => 'destroy', :code =>
rv_wrk_consult_type }, :confirm => 'Are you sure?', :method => :post

Finally, I made the following change to _form.rhtml:

<p><label for="rv_wrk_consult_type_code">Code</label><br/>
<!-- This was generated by Rails: --> <!-- %= text_field
'rv_wrk_consult_type', 'code' % -->
<!-- This is what I replace it with: -->
<%= text_field_tag 'code', params[:code], :maxlength => 10 %>

I hope this is understandable and can help you out. Of course, all
these changes are painful, especially if you have tens of legacy
database tables, like I have; so I suspect I'll end up creating an
Oracle view with ID instead of CODE... This should prevent me from
having to do all these changes... unless the fact that CODE is
alphanumeric brings up more problems!


I forgot to tell you about one other modification to the controller.
Even though my primary key is named "code", you still need to use "id"
when you set its value in function create:

    # Adding the ID ("CODE" in the database), so the non-existant
sequence isn't called: = params[:code]