Rails 3 - anidamiento de múltiples niveles - obteniendo un error constante sin inicializar

Soy nuevo tanto en programación como en Ruby on Rails. Solo estoy intentando con una muestra de anidación profunda de 2 niveles. Cuando seguí a Ryan's Scraps (http://ryandaigle.com/articles/2009/2/1/what-s-new-in-edge-rails-nested-attributes) para 1 nivel de profundidad anidando todo bien y bien, pero cuando me extendí por 2 niveles de profundidad, obtengo

NameError in ParentsController#new
uninitialized constant Child::Grandchild

Mis modelos son asi

class Parent < ActiveRecord::Base
  has_many :children
  accepts_nested_attributes_for :children, :allow_destroy => true
end

class Child < ActiveRecord::Base
  belongs_to :parent
  has_many :grandchildren
  accepts_nested_attributes_for :grandchildren
end

class GrandChild < ActiveRecord::Base
   belongs_to :child
end

Y mi controlador: el nuevo método para padres es ->

def new
  @parent = Parent.new
  2.times do 
    child = @parent.children.build  
    2.times {child.grandchildren.build}
  end


  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @parent }
  end
end

No sé cuál es el error, cuando modifiqué los modelos en

class Parent < ActiveRecord::Base
  has_many :children, :through => :grandchildren
  has_many :grandchildren
  accepts_nested_attributes_for :children, :allow_destroy => true
  accepts_nested_attributes_for :grandchildren, :allow_destroy => true
end

class Child < ActiveRecord::Base
  belongs_to :parent
  has_many :grandchildren
  accepts_nested_attributes_for :grandchildren
end

class GrandChild < ActiveRecord::Base
  belongs_to :parent
  belongs_to :child
end

entonces obtendré el siguiente error: uninitialized constant Parent::Grandchild..

No sé que es un error tonto o qué ...

Muchas Gracias


He editado mi pregunta, que es mi requisito real. En lugar de crear padres, hijos y nietos a la vez, como se mencionó anteriormente, quiero crear padres primero, luego hijo y nieto juntos. He editado el código anterior como se menciona a continuación,

Mi modelo:

class Parent < ActiveRecord::Base
has_many :children
has_many :grand_children
accepts_nested_attributes_for :children, :allow_destroy => true
accepts_nested_attributes_for :grand_children, :allow_destroy => true
end

class Child < ActiveRecord::Base
belongs_to :parent
has_many :grand_children
accepts_nested_attributes_for :grand_children
end

class GrandChild < ActiveRecord::Base
belongs_to :parent
belongs_to :child
end

Controlador de mis hijos -nuevo método:

    def new
@parent = Parent.find(params[:parent_id])
child = Child.new
child.grand_children.build
respond_to do |format|
format.html # new.html.erb
format.xml  { render :xml => @child }
end
end

La plantilla de _formulario de mis hijos es

<%= form_for([@parent, @parent.children.build]) do |form|  %>  
<div>
<%= form.label :name %><br />
<%= form.text_field :name %>
</div>
<div class="field">
<%= form.label :sex %><br />
<%= form.text_field :sex %>
</div>
<div>
<%= form.fields_for :grand_children do |grand_child_form| %>
<%= render :partial => "grand_children/form", :locals => { :form => grand_child_form}     %>
<% end %>
</div>
<% end %>

Aquí no recibo ningún error como tal, pero cuando selecciono un nuevo hijo, el nieto no aparece,

 <%= form.fields_for :grand_children do |grand_child_form| %>
  <%= render :partial => "grand_children/form", :locals => { :form => grand_child_form} %>
<% end %>

no se refleja en absoluto.

Gracias por adelantado

preguntado el 27 de agosto de 11 a las 16:08

Cuando estás creando una instancia de nietos, estás tratando de hacerlo con un hijo que no ha sido salvo. Esto no funcionará. Google para formularios anidados dobles encontrará tutoriales sobre esto. Escribiría más pero es domingo :) -

1 Respuestas

Creo que su error es el nombre de su asociación, pero no tengo una terminal de rieles para probarlo.

has_many :grandchildren

debiera ser

has_many :grand_children

GrandChild tiene una carcasa de camello, y se subrayará grand_child y grand_children cuando se coloque en una tabla.

Creo que rails está usando los métodos de subrayado / tableize al hacer sus asociaciones, si alguna vez vuelve a tener este problema con una asociación, tome el nombre de su clase en una consola y haga

"GrandChild".tableize
"GrandChild".underscore

Eso le dará los nombres de su asociación.

Respondido 28 ago 11, 01:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.