# Habtm in nested form

**URL:** <https://www.ruby-forum.com/t/habtm-in-nested-form/186558>\
**Category:** Rails\
**Created:** [April 8, 2010, 9:44pm UTC](https://www.ruby-forum.com/t/habtm-in-nested-form/186558 "2010-04-08T21:44:42Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![bebesuk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/dfb087/32.png) [@bebesuk](https://www.ruby-forum.com/u/bebesuk)\
**Post date:** [April 8, 2010, 9:44pm UTC](https://www.ruby-forum.com/t/habtm-in-nested-form/186558/1 "2010-04-08T21:44:42Z")

</div>

Hi! I have next

====== models  
require ‘paperclip’  
class User \< ActiveRecord::Base  
has\_one :user\_settings  
end

class UserSettings \< ActiveRecord::Base  
has\_one :habits\_and\_past  
accepts\_nested\_attributes\_for :habits\_and\_past  
end

class HabitsAndPast \< ActiveRecord::Base  
has\_and\_belongs\_to\_many :musics  
accepts\_nested\_attributes\_for :musics  
end

class Music \< ActiveRecord::Base  
has\_and\_belongs\_to\_many :habits\_and\_pasts

def display\_name  
“#{name}”  
end  
end

====== migrations  
for all models

class HabitsAndPastsMusics \< ActiveRecord::Migration  
def self.up  
create\_table :habits\_and\_pasts\_musics, :id =\> false do |t|  
t.references :habits\_and\_past  
t.references :music  
end  
end

def self.down  
drop\_table :habits\_and\_pasts\_musics  
end  
end

====== in users\_controller  
def saveprofile  
@user = User.find(params[:id])  
@user\_settings = UserSettings.new(params[:user\_settings])  
if @user\_settings.save  
flash[:notice] = ‘message’  
render :action =\> “show”  
else  
render :action =\> “addprofile”  
end  
end

====== in add\_profile.html.erb  
\<% form\_for :user\_settings, @user\_settings,  
:url=\>{:action=\>“saveprofile”} do |f|%\>  
\<%f.hidden\_field :user\_id, :value =\> @user.id%\>  
\<%= render :partial =\> “user\_settings”, :locals =\> { :f =\> f, :button =\>  
“Submit”} %\>  
\<% end %\>

====== \_user\_settings.html.erb  
…  
\<% f.fields\_for :habits\_and\_past\_attributes do |habit| %\>  
…

\<%= label("user\_settings[habits\_and\_past\_attributes]", "musics\_list" , "Musics") %\>  
 \<% Music.find(:all).each do |music| %\> \<%= check\_box\_tag("user\_settings[habits\_and\_past\_attributes][musics\_list] [#{music.id}]","1",false) %\>\<%= "#{music.display\_name}"%\>  
 \<% end %\>

...... \<%end%\>

======== when I press submit I see error

ActiveRecord::UnknownAttributeError in UsersController#saveprofile

unknown attribute: musics\_list

======= in params

“habits\_and\_past\_attributes”=\>{“favourite\_book”=\>"",  
“favourite\_group”=\>"",  
“favourite\_film”=\>"",  
“musics\_list”=\>{“1”=\>“1”,  
“2”=\>“1”},

I’m using rails 2.3.5

Question - How to save list of musics that was selected ?

---

<div class="post-metadata">

**Author:** ![bebesuk](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/b/dfb087/32.png) [@bebesuk](https://www.ruby-forum.com/u/bebesuk)\
**Post date:** [April 9, 2010, 11:10am UTC](https://www.ruby-forum.com/t/habtm-in-nested-form/186558/2 "2010-04-09T11:10:34Z")

</div>

Bohdan P. wrote:

> Hi! I have next
> 
> ====== models  
> require ‘paperclip’  
> class User \< ActiveRecord::Base  
> has\_one :user\_settings  
> end
> 
> class UserSettings \< ActiveRecord::Base  
> has\_one :habits\_and\_past  
> accepts\_nested\_attributes\_for :habits\_and\_past  
> end
> 
> class HabitsAndPast \< ActiveRecord::Base  
> has\_and\_belongs\_to\_many :musics  
> accepts\_nested\_attributes\_for :musics  
> end
> 
> class Music \< ActiveRecord::Base  
> has\_and\_belongs\_to\_many :habits\_and\_pasts
> 
> def display\_name  
> “#{name}”  
> end  
> end
> 
> ====== migrations  
> for all models
> 
> class HabitsAndPastsMusics \< ActiveRecord::Migration  
> def self.up  
> create\_table :habits\_and\_pasts\_musics, :id =\> false do |t|  
> t.references :habits\_and\_past  
> t.references :music  
> end  
> end
> 
> def self.down  
> drop\_table :habits\_and\_pasts\_musics  
> end  
> end
> 
> ====== in users\_controller  
> def saveprofile  
> @user = User.find(params[:id])  
> @user\_settings = UserSettings.new(params[:user\_settings])  
> if @user\_settings.save  
> flash[:notice] = ‘message’  
> render :action =\> “show”  
> else  
> render :action =\> “addprofile”  
> end  
> end
> 
> ====== in add\_profile.html.erb  
> \<% form\_for :user\_settings, @user\_settings,  
> :url=\>{:action=\>“saveprofile”} do |f|%\>  
> \<%f.hidden\_field :user\_id, :value =\> @user.id%\>  
> \<%= render :partial =\> “user\_settings”, :locals =\> { :f =\> f, :button =\>  
> “Submit”} %\>  
> \<% end %\>
> 
> ====== \_user\_settings.html.erb  
> …  
> \<% f.fields\_for :habits\_and\_past\_attributes do |habit| %\>  
> …
> 
> \<%= label("user\_settings[habits\_and\_past\_attributes]", "musics\_list" , "Musics") %\>  
> \<% Music.find(:all).each do |music| %\> \<%= check\_box\_tag("user\_settings[habits\_and\_past\_attributes][musics\_list] [#{music.id}]","1",false) %\>\<%= "#{music.display\_name}"%\>  
> \<% end %\>
> 
> ...... \<%end%\>
> 
> ======== when I press submit I see error
> 
> ActiveRecord::UnknownAttributeError in UsersController#saveprofile
> 
> unknown attribute: musics\_list
> 
> ======= in params
> 
> “habits\_and\_past\_attributes”=\>{“favourite\_book”=\>"",  
> “favourite\_group”=\>"",  
> “favourite\_film”=\>"",  
> “musics\_list”=\>{“1”=\>“1”,  
> “2”=\>“1”},
> 
> I’m using rails 2.3.5
> 
> Question - How to save list of musics that was selected ?

Solved

I added :join\_table option=\>"" in both models and changed  
====== \_user\_settings.html.erb  
…  
\<% f.fields\_for :habits\_and\_past\_attributes do |habit| %\>  
…

\<%= label("user\_settings[habits\_and\_past\_attributes]", "music\_ids" , "Musics") %\>  
 \<% Music.find(:all).each do |music| %\> \<%= check\_box\_tag("user\_settings[habits\_and\_past\_attributes][music\_ids] []","#{music.id}",false) %\>\<%= "#{music.display\_name}"%\>  
 \<% end %\>

 ...... \<%end%\>
