Couldn't find <Class> without an ID

I’m just starting to use forms and I’m stuck. I’m working with two

class Department < ActiveRecord::Base
has_many :employees

class Employee < ActiveRecord::Base
belongs_to :department

I can create records just fine. When I go back to edit them, I get
the message
Couldn’t find without an ID, where is either
Department or Employee.

My department controller contains these methods:

def create
@department =[:department])
flash[:notice] = ‘Department was successfully created.’
redirect_to :action => ‘list’
render :action => ‘new’

def edit
@department = Department.find(params[:id])
@managers = Employee.find(:all,
:order => ‘last_name, first_name’,
:conditions => “manager = 1”).map {|
#{m.first_name}" ,]}
render :layout => ‘isis-form’

def update
@department = Department.find(params[:id])
if @department.update_attributes(params[:department])
flash[:notice] = ‘Department was successfully updated.’
redirect_to :action => ‘show’, :id => @department
render :action => ‘edit’

The layout simply wraps the form in a

, which supplies some
formatting, and a .

My form partial is:

<%= error_messages_for ‘department’ %>

<% @form_action = set_form_action(@params[:action]) %>
<% logger.debug “params[action] = #{@params[:action]}” %>
<% logger.debug “form_action in form = #{@form_action}” %>
<% breakpoint %>

<% form_for :department, :url => { :action => @form_action } do |form|

Name: <%= form.text_field :name %>

Manager: <%= :manager_id, @managers %>

<%= submit_tag set_submit_tag_text( @params[:action]) %>

<% end %>

The set_form_action and set_submit_tag_text methods just set
the :action and button text depending on the action that calls the
form. The logger messages show me that :action => @form_action is
getting set to “update”.

I can see from the breakpoints that params[:id] is set properly when I
enter the from from the edit action and that it doesn’t exist at all
when I get to the update action. All the form fields are carried over
properly, but :id isn’t.

I have exactly the same problem with the employee form, which I guess
isn’t surprising since I coded it the same way.

I’m sure I’ve just done something really dumb, but after several hours
I still can’t see it and I can’t find any references that seem to
describe this problem. Can somebody please tell me what I’m doing

Thanks for taking the time to look at this.

– Mike

I believe the solution is to pass the :id value in addition to
the :action parameter for your form within the partials.

<% form_for :department, :url => { :action => @form_action, :id =>
params[:id] } do |form| %>

– Ryan

Hi Ryan,

You nailed it! That worked like a champ. Thanks so much for taking
the time to help me out.

– Mike