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