Añadir recursivamente campos select con ajax

Hola!. A ver si se puede hacer esto. He conseguido añadir campos
mediante archivos .rhtml. Tengo un radio dentro de un div que hace lo
siguiente:

<%= radio_button_tag(“radio_tecnologia_id”,“radio_tecnologia_id”,checked
= false) %>Añadir tecnología

<%= observe_field(‘radio_tecnologia_id’,
:frequency => 0.5,
:update => :tecnologia_div,
:url => {:action =>:segunda_tecnologia })
%>

Cuando se pulsa el radio se sustituye el div tecnologia_div por el
contenido de segunda_tecnologia.rhtml:

<%= select_tag(‘tecnologia_id2’ , options_for_select(
Tecnologia.find_all.collect {|c| [ c.tecnologia, c.id ] }<<["",""],"") )
%>

<%= radio_button_tag("radio_tecnologia_id","radio_tecnologia_id",checked = false) %>Añadir tecnología <%= observe_field('radio_tecnologia_id', :frequency => 0.5, :update => :tecnologia_div2, :url => {:action =>:tercera_tecnologia }) %>

Aparece un nuevo radio que al pulsarse llama a tercera_tecnologia.rhtml
que ya sólo contiene:

<%= select_tag(‘tecnologia_id3’ , options_for_select(
Tecnologia.find_all.collect {|c| [ c.tecnologia, c.id ] }<<["",""],"") )
%>

Esto está muy bien si sólo necesito añadir 3 tecnologias. Pero me
gustaría hacerlo recursivo, de forma que se fuesen añadiendo select cada
vez que pulsase el radio. Esto plantea los siguientes problemas:
·1- Cada select tiene que tener una id distinta. Así que necesito una
variable que se añada al final de tecnologia_id. Ej
“tecnologia_id”+$cont_tecno.to_s
·2- Cada vez que se añada código tengo que meter una nueva capa, y un
nuevo radio. Todo esto se maneja igual que antes, añadiendo al final del
nombre un contador.
·3- El contador se tiene que incrementarse cada vez que se añada un
select.
·4- (Aquí todavía no he entrado) El controlador tiene que tener un bucle
que recorra todos los select para poder hacer la búsqueda.

Entonces he pensando en eso, en crearme una variable e ir
incrementandola, pero no he conseguido que funcione, sólo me ejecuta la
primera vez, luego se queda pulsado el radio (osea que no me cambia el
div por el .rhtml)

Bueno después de esta parrafada, a alguien se le ocurre que estoy
haciendo mal, o si hay alguna forma más sencilla??.

Un saludo y gracias de antemano.

El Aug 3, 2007, a las 10:14 AM, Marcos C.
escribió:

nombre un contador.
div por el .rhtml)

Bueno después de esta parrafada, a alguien se le ocurre que estoy
haciendo mal, o si hay alguna forma más sencilla??.

En programacion web no suele ser buena idea usar variables globales,
excepto para constantes si acaso (en cuyo caso en Ruby se usan
constantes propiamente).

El problema es que normalmente la variable depende del usuario, que
en multiproceso no se comparten variables globales por haber un
interprete distinto en cada uno, si estas en modo CGI hay un
interprete nuevo por peticion…, en web no funcionan bien en
general. Por ello lo normal es acarrear el contexto de algun otro
modo y por usuario.

Y ahi entramos en terreno tradicional, eso es ni mas ni menos que la
sesion. O bien te llevas el indice a la vista y luego lo envias de
nuevo en observe_field para que ese pueda ser incrementado y vuelta
de nuevo, o bien usas la sesion misma. Hemos bajado a lo basico que
es la necesidad de compartir algo entre peticiones.

La primera opcion seria lo analogo a lo que en contexto forms
implementas con campos ocultos como alternativa a la sesion misma.

– fxn

Si la verdad es que yo soy totalmente nuevo en programación web. Estuve
mirando que tipo de variables podía usar con ruby. Sabía que usar una
global no era buena idea, pero era para asegurarme de que funcionase. De
todas formas he probado tanto variables de instancia como locales, y no
funcionan porque se pierden al añadir el nuevo trozo de página.

De todas formas a partir del 3er párrafo de tu post no entiendo na jeje.
No se muy bien cual es la solucion que me das.

Un saludo.

Marcos C. escribió:

Si la verdad es que yo soy totalmente nuevo en programación web. (…)
De todas formas a partir del 3er párrafo de tu post no entiendo na jeje.
No se muy bien cual es la solucion que me das.

Xavier intentaba aclararte que en programación web lo típico es no
compartir variables entre usuarios: ni las variables de instancia de tus
controladores ni las variables locales de sus funciones son persistentes
entre peticiones (es decir, no mantienen actualizado su valor entre la
petición anterior y la actual).

Para solucionar esto tienes dos mecanismos básicos: almacenar esas
variables en la sesión del usuario o almacenarlas en el código del
cliente.

Como dices que eres nuevo en este terreno no sé si conoces el concepto
de “sesión de usuario”. Puedes leer un poco acerca de qué son las
sesiones y cómo se gestionan en Rails en el propio wiki de RoR:

http://wiki.rubyonrails.org/rails/pages/sessions

Saludos,
Raul M.

Pues muchas gracias. La verdad es que es bastante útil y sencillo. Yo
creo que es la primera cosa de RoR que me funciona a la primera.

Bueno de todas formas sigo con mi problema. Alguien ha hecho alguna vez
lo que yo quiero hacer (que pinchando en un botón aparezcan más campos
select con ids distintos)???

Un saludo

Marcos C. escribió:

Pues muchas gracias. La verdad es que es bastante útil y sencillo. Yo
creo que es la primera cosa de RoR que me funciona a la primera.

Bueno de todas formas sigo con mi problema. Alguien ha hecho alguna vez
lo que yo quiero hacer (que pinchando en un botón aparezcan más campos
select con ids distintos)???

¿Sigues con el problema? En ese caso, ¿a qué te refieres cuando dices
que te funciona a la primera? ¿Has consultado la documentación del wiki
sobre sesiones?

Si si, si la variable usando la sesion funciona perfectamente. Lo que no
funciona es por lo que abrí el post.

Intento generar de forma recursiva y mediante ajax, una serie(ilimitada)
de campos select. Para ello utilizo un observe_field que sustituye un
div por un archivo rhtml. Lo he conseguido creandome 3 archivos a los
que voy llamando desde el anterior. Pero me gustaría usar sólo uno y que
fuese algo recursivo.

Pero como veo que no lo consigo, estoy pensando en utilizar un bucle,
desde 1 y hasta session[:contTecno] que me escriba selects. Voy a
probarlo.

Un saludo.

Marcos C. escribió:

desde 1 y hasta session[:contTecno] que me escriba selects. Voy a
probarlo.

Como la única diferencia entre tus archivos es ese id, lo ideal es que
los renderices como partials, y les pases ese id como parámetro:

:partial => ‘tu_archivo’, :locals => {:nuevo_id => tu_nuevo_id}

(Siendo tu_nuevo_id el que vas guardando en la sesión, y que incrementas
cada vez que generas un nuevo select).

De esa forma en esos archivos tendrás la variable nuevo_id disponible, y
podrás hacer cosas con esta pinta:

De todas formas diría que todo esto puedes hacerlo solamente con
javascript, ahorrándote las llamadas al servidor…

Saludos,
Raul M.

Ya lo he conseguido. Simplemente era crearme una variable y meterle en
formato cadena el nombre más el contador y luego usar la variable sin
los dos puntos (aquí era donde fallaba).

Un saludo y gracias a todos

Hombre eso que dices tiene muy buena pinta, pero no se muy bien como
implementarlo. He probado a sustituir el param del observe_field :url,
por :partial, pero no parece funcionar. De todas formas ya lo había
implementado con un for que me genera los select. El problema de esto es
que se me borran los checked de los campos al añadir uno más (cosa que
podría solucionar pasándolos por parámetro)

Bueno aparte de todo esto tengo otro problemilla jeje (perdona por
preguntar tanto). Resulta que ahora necesito utilizar los campos en el
controlador, y claro no se cuantos son, por lo que la única forma es
hacer otro bucle y añadir a la palabra tecnologia_id el nombre del
iterador del bucle. Algo así como:

@search << params[:[email protected]_s]

Pero eso no me deja hacerlo. Alguien sabe como podría hacerlo??

Un saludo.