has_and_belongs_to_many problems when editing

Hello,

Right now I have a has_and_belongs_to_many relationship between an events table and a users table. So the join table rows look something like this:

event_id user_id 1 2 1 3 1 5

Where those users are added through a list of checkboxes.

The problem is that if I want to edit info. and add for example one more user, rails will erase all existing data on the join table and replace it with the new user.

event_id user_id 1 7

Is there a way around this?

Please help! and thanks!

Could you show us the code that led to this?

Eric LIn wrote:

Could you show us the code that led to this?

On Jul 10, 6:49�pm, Elias Orozco <rails-mailing-l...@andreas-s.net>

Hi, This is my view code for the edit action.

<h1>Editing event</h1>

<% form_for ([current_user.neighborhood, @event]) do |f| %>   <%= f.error_messages %>   <p>     <%= f.label :date %><br />     <%= f.datetime_select :date %>   </p>   <p>     <%= f.label :title %><br />     <%= f.text_field :title %>   </p>   <p>     <%= f.label :place %><br />     <%= f.text_field :place %>   </p>   <p>     <%= f.label :description %><br />     <%= f.text_area :description %>   </p>   <p>     <% # f.label :user_id %><br />     <% # f.text_field :user_id %>     <% # hidden_field(:event, :user_id, { :value => current_user.id } ) %>   </p>   <p>     <%= f.label :event_category_id %><br />     <% # f.text_field :event_category_id %>     <%= collection_select(:event, :event_category_id, @event_categories, :id, :name) %>   </p>   <p>     <% unless @friends.empty? %>       <div id="friends-invited">       <ul>         <% for friend in @friends do %>            <li><input type = "checkbox" name = "event[user_ids]" value = "<%= friend.id %>" /><%= " "+friend.name %></li>         <% end %>         </ul>         </div>     <% end %>   </p>   <p>     <%= f.submit "Update" %>   </p> <% end %>

<%= link_to 'Show', neighborhood_event_path(current_user.neighborhood,@event) %> | <%= link_to 'Back', neighborhood_events_path(current_user.neighborhood) %>

The edit and update actions:

  # GET /events/1/edit   def edit     @event = Event.find(params[:id])     @event_categories = EventCategory.find(:all)     @friends = current_user.mutual_friends   end

  def update     @event = Event.find(params[:id])     respond_to do |format|       if @event.update_attributes(params[:event])         flash[:notice] = 'Event was successfully updated.'         format.html { redirect_to neighborhood_events_path }         format.xml { head :ok }       else         # Added to show again all the event_categories on the form         @event_categories = EventCategory.find(:all)         format.html { render :action => "edit" }         format.xml { render :xml => @event.errors, :status => :unprocessable_entity }       end     end   end

So what's happening is that if I edit an event and choose others friends (check various checkboxes on the view). This new friends will replace the old friends in the join table events_users (friends are user objects). I want this new friends to be added to the join table without deleting the ones before.

Thanks again.

Just took a rough look at your code, and I believe the event[user_ids] form elements are not used properly. I suggest you take a look at #17 HABTM Checkboxes - RailsCasts for how it should be done.

Eric