This is how I've done it. I'm sure the coding can be improved - I tend to write fairly verbose code. However, this will at least get you started. I've called my groups of people 'crowds':
Controller
crowds_controller.rb
Code:
def assign_users
@crowd = Crowd.find(params[:id])
@all_users = User.find(:all)
if !request.get? and params["crowds"]["user"]
if @user = User.find(:first, :conditions => ["id = ?", params["crowds"]["user"]])
if @crowd.users.include?(@user)
flash[:notice] = "#{@user.user_name} is already assinged to crowd #{@crowd.name}"
else
@crowd.users << @user
@crowd.save
flash[:notice] = "Success. #{@user.user_name} assigned to crowd #{@crowd.name}"
end
end
end
end
def unassign_user
@crowd = Crowd.find(params[:id])
@user = User.find(:first, :conditions => ["id = ?", params["user"]])
if @crowd.users.delete(@user)
@crowd.save
flash[:notice] = "Success. #{@user.user_name} unassigned from crowd #{@crowd.name}"
else
flash[:notice] = "Failue. Unable to unassign #{@user.user_name} from crowd #{@crowd.name}"
end
redirect_to :action => 'assign_users', :id => @crowd
end
View
assign_users.rhtml
Code:
<h2>crowd is <%= @crowd.name -%></h2>
<%= start_form_tag :action => 'assign_users', :id => @crowd %>
<p><label for="user_crowd_ids">Users</label><br/>
<%= collection_select("crowds", "user", @all_users, :id, :user_name, {:include_blank => true}) %> </p>
<%= submit_tag 'Add' %>
<%= end_form_tag %>
<p><%= link_to "crowd list", :action => 'list' -%><p>
<% if @crowd.users.length > 0 -%>
<h2>Users assigned to crowd <%= @crowd.name -%></h2>
<table>
<tr>
<th>User</th>
<tr>
<% for user in @crowd.users %>
<tr>
<td><%= user.user_name -%></td>
<td>
<%= start_form_tag :action => 'unassign_user', :id => @crowd, :user => user -%>
<%= submit_tag 'Unassign' -%>
<%= end_form_tag -%>
</td>
</tr>
<% end -%>
</table>
<% end -%>
It's a very simple form as I use it within the administration pages of an intranet, so it's very basic.
Bookmarks