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