Hopefully someone can help. I have the following models class Parent < ActiveRecord::Base ## schema id int, name string has_many :children accepts_nested_attributes_for :children end class Child < ActiveRecord::Base ## schema id int, name string, parent_id int belongs_to :parent end ... the following view ... <h1>New parent</h1> <% form_for :parent, :url => { :action => :create } do |p| %> <%= p.text_field :name %> <br /> <% p.fields_for :children do |c| %> <%= c.text_field :name %> <% end %> <%= p.submit ''Create'' %> <% end %> ... and a scaffold built parents_controller .... # GET /parents/new # GET /parents/new.xml def new @parent = Parent.new respond_to do |format| format.html # new.html.erb format.xml { render :xml => @parent } end end # POST /parents # POST /parents.xml def create @parent = Parent.new(params[:parent]) respond_to do |format| if @parent.save flash[:notice] = ''Parent was successfully created.'' format.html { redirect_to(@parent) } format.xml { render :xml => @parent, :status => :created, :location => @parent } else format.html { render :action => "new" } format.xml { render :xml => @parent.errors, :status => :unprocessable_entity } end end end I''m getting this error ... ActiveRecord::AssociationTypeMismatch in ParentsController#create Child(#-608967938) expected, got Array(#-605071598) Paramters ... {"parent"=>{"name"=>"Ants", "children"=>{"name"=>"Pants"}}, "commit"=>"Create", "authenticity_token"=>"x4BoHI06Asp6QumOwFkccthv+no7ychn57tqOl7q9Ig="} I''ve tried inserting the same details via the console and it worked but I provided a list ot children_attributes .... params = { :parent => { :name => ''Ants'', :children_attributes => [ { :name => ''Pants'' } ] } } p = Parent.create(params[:parent]) and that works fine So, how do I get *:children_attributes => [ { :name => ''Pants'' } ] }* to be passed in the params to the controller from the form_for / fields_for in the view? Plus, I really need to get this to work with another model relationship that such as .... class Account < ActiveRecord::Base has_many :memberships has_many :members, :through => :memberships accepts_nested_attributes_for :members end class Member < ActiveRecord::Base has_many :memberships has_many :accounts, :through => :memberships end class Membership < ActiveRecord::Base belongs_to :member belongs_to :account end Is there anything special I need to fdo for the :through ??/ Thank you for any light you can throw on this -Ants -- 100% naturally selected. 0% designed. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Hi Anthony, It looks like your form_for line in your view is wrong... try this: <% form_for(@parent) do |p| %> ...instead of this: <% form_for :parent, :url => { :action => :create } do |p| %> For some reason the way you called form_for isn''t compatible with the nested attributes feature, and so your form''s HTML didn''t contain the proper name for the child field name="parent[children_attributes][0] [name]". Also, I added a line to your controller to create a single new child when creating a new parent form; otherwise the child name field won’t appear: def new @parent = Parent.new @parent.children.build respond_to do |format| format.html # new.html.erb format.xml { render :xml => @parent } end end It should work exactly the same way with the has_many, :through association. Hope this helps! - pat On Jul 21, 3:10 pm, Anthony Gardner <antsmailingl...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hopefully someone can help. I have the following models > > class Parent < ActiveRecord::Base > ## schema id int, name string > has_many :children > accepts_nested_attributes_for :children > end > > class Child < ActiveRecord::Base > ## schema id int, name string, parent_id int > belongs_to :parent > end > > ... the following view ... > > <h1>New parent</h1> > > <% form_for :parent, :url => { :action => :create } do |p| %> > <%= p.text_field :name %> > <br /> > <% p.fields_for :children do |c| %> > <%= c.text_field :name %> > <% end %> > > <%= p.submit ''Create'' %> > > <% end %> > > ... and a scaffold built parents_controller .... > > # GET /parents/new > # GET /parents/new.xml > def new > @parent = Parent.new > > respond_to do |format| > format.html # new.html.erb > format.xml { render :xml => @parent } > end > end > > # POST /parents > # POST /parents.xml > def create > @parent = Parent.new(params[:parent]) > > respond_to do |format| > if @parent.save > flash[:notice] = ''Parent was successfully created.'' > format.html { redirect_to(@parent) } > format.xml { render :xml => @parent, :status => :created, :location > => @parent } > else > format.html { render :action => "new" } > format.xml { render :xml => @parent.errors, :status => > :unprocessable_entity } > end > end > end > > I''m getting this error ... > ActiveRecord::AssociationTypeMismatch in ParentsController#create > > Child(#-608967938) expected, got Array(#-605071598) > > Paramters ... > {"parent"=>{"name"=>"Ants", > "children"=>{"name"=>"Pants"}}, > "commit"=>"Create", > "authenticity_token"=>"x4BoHI06Asp6QumOwFkccthv+no7ychn57tqOl7q9Ig="} > > I''ve tried inserting the same details via the console and it worked but I > provided a list ot children_attributes .... > > params = { :parent => { :name => ''Ants'', :children_attributes => [ { :name > => ''Pants'' } ] } } > p = Parent.create(params[:parent]) > > and that works fine > > So, how do I get *:children_attributes => [ { :name => ''Pants'' } ] }* to be > passed in the params to the controller from the form_for / fields_for in the > view? > > Plus, I really need to get this to work with another model relationship that > such as .... > > class Account < ActiveRecord::Base > has_many :memberships > has_many :members, :through => :memberships > > accepts_nested_attributes_for :members > end > > class Member < ActiveRecord::Base > has_many :memberships > has_many :accounts, :through => :memberships > end > > class Membership < ActiveRecord::Base > belongs_to :member > belongs_to :account > end > > Is there anything special I need to fdo for the :through ??/ > > Thank you for any light you can throw on this > > -Ants > -- > 100% naturally selected. 0% designed.
Cool. Thanks, Pat. Have just implemented that and it works fine .... even with :through. Nice. -Ants 2009/7/22 Pat <pat-TqfKzuDnBR2xH1ktNt+OzKxOck334EZe@public.gmane.org>> > Hi Anthony, > > It looks like your form_for line in your view is wrong... try this: > <% form_for(@parent) do |p| %> > > ...instead of this: > <% form_for :parent, :url => { :action => :create } do |p| %> > > For some reason the way you called form_for isn''t compatible with the > nested attributes feature, and so your form''s HTML didn''t contain the > proper name for the child field name="parent[children_attributes][0] > [name]". Also, I added a line to your controller to create a single > new child when creating a new parent form; otherwise the child name > field won’t appear: > > def new > @parent = Parent.new > @parent.children.build > > respond_to do |format| > format.html # new.html.erb > format.xml { render :xml => @parent } > end > end > > It should work exactly the same way with the has_many, :through > association. Hope this helps! > > - pat > > > On Jul 21, 3:10 pm, Anthony Gardner <antsmailingl...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > Hopefully someone can help. I have the following models > > > > class Parent < ActiveRecord::Base > > ## schema id int, name string > > has_many :children > > accepts_nested_attributes_for :children > > end > > > > class Child < ActiveRecord::Base > > ## schema id int, name string, parent_id int > > belongs_to :parent > > end > > > > ... the following view ... > > > > <h1>New parent</h1> > > > > <% form_for :parent, :url => { :action => :create } do |p| %> > > <%= p.text_field :name %> > > <br /> > > <% p.fields_for :children do |c| %> > > <%= c.text_field :name %> > > <% end %> > > > > <%= p.submit ''Create'' %> > > > > <% end %> > > > > ... and a scaffold built parents_controller .... > > > > # GET /parents/new > > # GET /parents/new.xml > > def new > > @parent = Parent.new > > > > respond_to do |format| > > format.html # new.html.erb > > format.xml { render :xml => @parent } > > end > > end > > > > # POST /parents > > # POST /parents.xml > > def create > > @parent = Parent.new(params[:parent]) > > > > respond_to do |format| > > if @parent.save > > flash[:notice] = ''Parent was successfully created.'' > > format.html { redirect_to(@parent) } > > format.xml { render :xml => @parent, :status => :created, > :location > > => @parent } > > else > > format.html { render :action => "new" } > > format.xml { render :xml => @parent.errors, :status => > > :unprocessable_entity } > > end > > end > > end > > > > I''m getting this error ... > > ActiveRecord::AssociationTypeMismatch in ParentsController#create > > > > Child(#-608967938) expected, got Array(#-605071598) > > > > Paramters ... > > {"parent"=>{"name"=>"Ants", > > "children"=>{"name"=>"Pants"}}, > > "commit"=>"Create", > > "authenticity_token"=>"x4BoHI06Asp6QumOwFkccthv+no7ychn57tqOl7q9Ig="} > > > > I''ve tried inserting the same details via the console and it worked but I > > provided a list ot children_attributes .... > > > > params = { :parent => { :name => ''Ants'', :children_attributes => [ { > :name > > => ''Pants'' } ] } } > > p = Parent.create(params[:parent]) > > > > and that works fine > > > > So, how do I get *:children_attributes => [ { :name => ''Pants'' } ] }* to > be > > passed in the params to the controller from the form_for / fields_for in > the > > view? > > > > Plus, I really need to get this to work with another model relationship > that > > such as .... > > > > class Account < ActiveRecord::Base > > has_many :memberships > > has_many :members, :through => :memberships > > > > accepts_nested_attributes_for :members > > end > > > > class Member < ActiveRecord::Base > > has_many :memberships > > has_many :accounts, :through => :memberships > > end > > > > class Membership < ActiveRecord::Base > > belongs_to :member > > belongs_to :account > > end > > > > Is there anything special I need to fdo for the :through ??/ > > > > Thank you for any light you can throw on this > > > > -Ants > > -- > > 100% naturally selected. 0% designed. > > >-- 100% naturally selected. 0% designed. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---