Rails 3 - join table not updated when creating new HABTM association
has-and-belongs-to-many, join, ruby-on-rails, ruby-on-rails-3
Solution
- Use plurals for has_many associations
Build the album directly within the user's albums
@album = @user.album.create(params[:album])
Problem
I've spent the last three days on this and I can't find any answer anywhere. I'm trying to learn Rails, and I started with what seemed a pretty easy application. I have 2 models: ``` class Album < ActiveRecord::Base has_and_belongs_to_many :users attr_accessible :title end ``` and ``` class User < ActiveRecord::Base has_and_belongs_to_many :albums attr_accessible :first_name, :last_name end ``` I also created the join table ``` create_table "albums_users", :id => false t.integer "album_id" t.integer "user_id" ``` My users/show.html.erb file contains a form ``` <%= form_for([@user, @user.albums.build]) do |f| %> ``` When this form is sent, it calls my album#create controller ``` def create @user = User.find(params[:user_id]) @album = @user.albums.cre(params[:album]) @album.save end ``` This creates a new album but doesn't create the entry in the join table. When looking at the parameters hash sent when submitting the form, I have ``` Parameters: {"utf8"=>"✓", "commit"=>"Create Album", "user_id"=>"1", "authenticity_token"=>"XNCPLYWQRzjpuQfjqbR7XuhMjr5iRzjLiqXpqZ4spFo=", "album"=>{"event"=>"title"=>"My Title"}} ``` And the SQL request doesn't use the user_id value from the parameter hash SQL (3.4ms) INSERT INTO "albums" ("title", "user_id") VALUES (?, ?) [["title", "My Title"],["user_id", nil]] I tried adding a hidden_field to my form with the user_id but then I get this error ``` Can't mass-assign protected attributes: user_id ``` Can someone explain me what is wrong with my models and my association? Thanks!