HABTM Checkboxes - Updating Users to a Project


#1

Hello all,

I’m trying to create a HABTM checkbox action that adds ‘users’ to a
‘project’.
I have the following laid out.


TABLES

create_table “assignments”, :id => false, :force => true do |t|
t.column “project_id”, :integer, :default => 0, :null => false
t.column “user_id”, :integer, :default => 0, :null => false
end

create_table “projects”, :force => true do |t|
t.column “title”, :string
t.column “description”, :text
t.column “start_date”, :datetime
t.column “end_date”, :datetime
end

create_table “users”, :force => true do |t|
t.column “first_name”, :string
t.column “last_name”, :string
end


MODELS

Assignment

class Assignment < ActiveRecord::Base
belongs_to :project
belongs_to :user
end

#Project
class Project < ActiveRecord::Base
has_many :assignments
has_many :users, :through => :assignments
end

User

class User < ActiveRecord::Base
has_many :assignments
has_many :projects, :through => :assignments
end

So at this point I created dummy data for my “assignment” table in the
following:

Assignment data

project_id user_id
1 1
1 2
1 3
2 1
3 1

So as you can see project_id 1 contains 3 unique users to the project
and they are user_id 1, 2, 3. Which I think is how i want the model to
work. I think!?

So when I go to my projects controller I have the standard scaffold
generated code for update.

#projects_controller.rb
def update
@project = Project.find(params[:id])
if @project.update_attributes(params[:project])
flash[:notice] = ‘Project was successfully updated.’
redirect_to :action => ‘show’, :id => @project
else
render :action => ‘edit’
end
end

when I go to the projects view/_form.rhtml I have this code to pull in
the Users associated with a particular project.

projects/_form.html

<% User.find(:all, :order => “last_name ASC”).each do |u| %>
<%= check_box_tag ‘project[user_id][]’, u.id,
@project.users.include?(u) %> <%= u.first_name %> <%= u.last_name
%>

<% end %>

This works well because it will pull in all users from the users table
and it will check off the checkbox for all the ones that are associated
with the project.


THE ISSUE

The issue I’m running into is how to “add/update/remove” users from a
project. I think it might be my check box tag.

projects/_form.html

<%= check_box_tag ‘project[user_id][]’, u.id,
@project.users.include?(u) %> <%= u.first_name %> <%= u.last_name
%>

Does this make sense…

project[user_id][]

<%= check_box_tag project[user_id][]’…

When I try to make any updates to a projects assigned user list (in
this example I’m removing user_id 3 from the project) I get the
following error


NoMethodError in ProjectsController#update

undefined method ‘user_id=’ for #Project:0x224b564


Request

Parameters:
{“commit”=>“Edit”,
“project”=>{“end_date(3i)”=>“25”, “start_date(1i)”=>“2006”,
“title”=>“Test Project”,
“start_date(2i)”=>“12”, “client_id”=>“3”, “start_date(3i)”=>“23”,
“description”=>“Lore ver sisit nit ut loreet .”,
“user_id”=>[“1”,“2”],
“end_date(1i)”=>“2006”,
“end_date(2i)”=>“12”},
“id”=>“2”}


Final thought / question

What’s interesting is the ‘updated’ values are in the parameters
(“user_id”=>[“1”,“2”]) but they are not updating the join table of
‘assignments’.

I think I might be relying on ActiveRecords Magic too much in hoping it
would update the ‘assignments’ table. Does anyone know what I can do to
remedy the problem.

Should I rethink my set-up or is it the check_box_tags value
“project[user_id][]” that is the problem?

Any thoughts would be helpful.