Habtm in nested form

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 ?

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%>