2009-08-03 13 views
7

He estado intentando implementar un formulario dinámico de modelos múltiples con accepts_nested_attributes_for en mi aplicación de rieles. He estado siguiendo el complex-forms example de Eloy Duran que muestra una implementación de 2 niveles, pero he intentado expandir esto a 3 niveles. ¿Hay soporte con accepts_nested_attributes_for para un formulario de 3 niveles? ¿Alguien puede mostrarme cómo expandir la aplicación de ejemplo?Formas anidadas de tres niveles en rieles utilizando accept_nested_attributes_for

Tengo el javascript funcionando parcialmente (no siempre funciona por algún motivo) para el 3er nivel, pero no puedo guardar el (los) objeto (s) de 3er nivel. El param name que está pasando para cada atributo es:

greatgrandparent[grandparent_attributes][0][parent_attributes][0][object_attributes][1249277008434][attribute] 

Dónde greatgrandparent es el objeto de la forma es para, abuelo es el primer nivel, el padre es el segundo nivel, y el objeto es el tercero nivel (el que yo estoy tratando de salvar).

Gracias, agradezco cualquier información.

Respuesta

18

He actualizado mi complex-form-examples para trabajar con Rails 2.3. Vea el deep branch para ver un ejemplo en modelos profundamente anidados.

git clone git://github.com/ryanb/complex-form-examples.git 
cd complex-form-examples 
git checkout -b deep origin/deep 
rake db:migrate 
script/server 

Es la solución más limpio que he visto hasta ahora. Si encuentra algún error o mejora, add an issue on GitHub.

+0

Eres un protector de la vida. – Anon

+0

Hola Ryan: ¿podrías comentar sobre cualquier cambio que pueda ser necesario realizar para implementar una rama profunda en Rails 3? – sscirrus

+1

Vea los episodios Railscasts 196 y 197 para mi última solución. Debería funcionar con anidamiento profundo y en Rails 3 con solo algunos cambios. http://railscasts.com/episodes/196-nested-model-form-part-1 – ryanb

2

En primer lugar, gracias Ryan por publicar su solución. Funciona muy bien en una forma de dos niveles, pero tengo problemas para usarlo en una forma anidada más profunda. Firebug me da un error de javascript si quiero poner un add_child_link en otro parcial ya agregado. Parece que hay un error de escape.

Ya traté de evitar el escape del parcial interno pasando otra opción al método de enlace, pero esto de alguna manera no funciona.

def add_child_link(name, f, options) 
    fields = new_child_fields(f, options) 
    fields = escape_javascript(fields) unless options[:already_escaping] == true 
    link_to_function name, %{ 
     var new_object_id = new Date().getTime(); 
     var html = jQuery("#{fields}".replace(/#{options[:index]}/g, new_object_id)).hide(); 
     html.appendTo(jQuery("#{options[:where]}")).show(); 
     } 
end 

¿Alguna pista sobre eso?

Saludos,

Mike

Cuestiones relacionadas