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.