Sigo peleando con las listas!

compañeros tengo un problema con las listas, al guardar me genera el
siguiente error:
undefined method `centro’ for #Funcionario:0x4947d08
Request
Parameters: {“commit”=>“Guardar”, “funcionario”=>{“nombre”=>“dsadas”,
“foto”=>“dada”, “ubicacion”=>“sdsfd”, “telefono”=>“1312”},
“dependencia”=>{“id”=>“1”}, “regional”=>{“id”=>“1”},
“centro”=>{“id”=>“1”}}

Estoy Aplicando el ejemplo:

tengo el helper.rb y el js, me despliega bien solo que genera problema
al guardar, creo que debo cargar el modelo dependencia a partir del
modelo centro, pero en la vista ya viene cargado os valores. me ayudan
por favor.

#Controller
funcionarios_controller
def regional_update
return unless request.xhr?
level_twos = Centro.find(:all, :conditions => [“regional_id=?”,
params[:regional_id]] )
render :update do |page|
page << update_select_box(“centro_id”,
level_twos,
{:text => :nombre,
:clear => [‘dependencia_id’]} )
end
end

def centro_update
return unless request.xhr?
level_threes = Dependencia.find(:all, :conditions =>
[“centro_id=?”, params[:centro_id]])
render :update do |page|
page << update_select_box(“dependencia_id”,
level_threes,
{:text => :nombre} )
end
end

#view funcionarios
_form
<%= error_messages_for ‘funcionario’ %>

Regional <%= select( "regional", "id", Regional.find(:all).collect{ |l1| [l1.nombre, l1.id] }, { :include_blank => true } ) %> Centro <%= select( "centro", "id", [] ) %> dependencia <%= select( "dependencia", "id", [] ) %> Nombre <%= text_field 'funcionario', 'nombre' %> Telefono <%= text_field 'funcionario', 'telefono' %> Foto <%= text_field 'funcionario', 'foto' %> Ubicacion <%= text_field 'funcionario', 'ubicacion' %>

<%= observe_field “regional_id”, {:url => {:action =>
‘regional_update’}, :with => “regional_id”} %>
<%= observe_field “centro_id”, {:url => {:action =>
‘centro_update’}, :with => “centro_id” } %>

Hola,

Parameters: {“commit”=>“Guardar”, “funcionario”=>{“nombre”=>“dsadas”,
“foto”=>“dada”, “ubicacion”=>“sdsfd”, “telefono”=>“1312”},
“dependencia”=>{“id”=>“1”}, “regional”=>{“id”=>“1”},
“centro”=>{“id”=>“1”}}

viendo la forma en que te llegan los parámetros y como los quieres
recoger luego en el controller, me da la impresión de que confundes los
helpers de formulario “select” y “select_tag”. Prueba a cambiar <%=
select( “regional”, “id” … por <%= select( “funcionario”,
“regional_id”…

y lo mismo para centro y dependencia. Bueno, eso suponiendo que en
funcionario tengas un campo centro_id, dependencia_id y regional_id

Te recomendaría antes de meterte a hacer cosas con ajax y listas
dependientes afianzar un poco el trabajo con los helper de formulario ya
que es básico. Cógete la documentación, o mejor un buen libro, y mírate
las diferencias entre text_field y text_field_tag, etc…

Una vez tengas claro eso (no antes) es cuando puedes ir intentando hacer
otras cosas más complejas… poco a poco… si no al final vas a acabar
copiando y pegando y haciendo cosas que funcionan sin saber muy bien
cómo y si alguien no ha hecho antes lo que tú buscas lo vas a tener
complicado.

En cualquier caso, es sólo una opinión.

Saludos,

javier ramírez

Si, Gracias Javier, tienes razon…

Hola Javier.

gracias, pero en funcionarios solo tengo dependencia_id, no tengo
regional_id ni centro_id.

debo guardar ademas de los campos id, nombre, telefono, foto y
ubicacion, debo guardar dependencia_id. los campos de regional:id y
centro_id son solo para llegar a dependencia.

ya he intentado mucho. gracias por tu ayuda.

Gracias Javier.

pero el codigo que debo poner en el aplication_helper tiene valores
quemados como el id,nombre, y cuando los cambio en la vista por los
nombres que debe ser, entonces ni siquiera me carga las listas.

def update_select_box(target_dom_id, collection, options={} )
# Set the default options
options[:text] ||= ‘nombre’
options[:value] ||= ‘id’
#options[:include_blank] ||= true
options[:include_blank] = true unless
options.include?(:include_blank)
options[:clear] ||= []
pre = options[:include_blank] ? [[’’,’’]] : []

  out = "update_select_options( $('" << target_dom_id.to_s << "'),"
  out << "#{(pre + collection.collect{ |c| 

[c.send(options[:text]),c.send(options[:value])]}).to_json}" << “,”
out << “#{options[:clear].to_json} )”
end

ayudame por favor.

uuuuupppppppppppppppsssssssss.

por fin cuadre lo de las tres listas dinamicas, me permite ingresar,
consultar y editar, la cosa no es tan fácil. Gracias a todos sus
aportes lo logré. creo que algun dia deben sacar un plugins para eso,
ya que se pierde mucho tiempo en las listas en cascada.

saludos.

Hola,

gracias, pero en funcionarios solo tengo dependencia_id, no tengo
regional_id ni centro_id.

Entonces es justamente el caso en que para esos campos debes usar
select_tag en lugar de select. Te remito al mail anterior. Mírate la
diferencia entre uno y otro (básicamente los que llevan _tag son campos
“de toda la vida” cuyo nombre y valor serán los que les digas, y los que
no llevan _tag son campos que están vinculados a un objeto y su nombre
se envía en forma de hash tomando los valores del objeto).

ya he intentado mucho.

quizás sí… pero como te decía en el mail anterior deberías ver las
diferencias entre los helper de formularios de un tipo u otro.
Justamente tu problema en este segundo mail viene por ahí. Si no
entiendes cómo se envían los parámetros, va a ser difícil que los puedas
recoger en el lado del servidor.

no Marze, no fue tan fácil, ya que no se nada de ajax, y apenas aprendo
rails. me lance a hacer algo antes de tiempo y me pesó, pero bueno ahi
vamos.

quiero mas a delante optimizarlas.

cordial saludo.

na, solo lo digo xq quizás con un poco de tiempo y unos cuantos
http://railscasts.com igual puedes hacerlo!
yo todavía no tengo mucha idea, xo hay q atreverse!

ánimo,
marze

El 30/05/2007, a las 2:29, William B.
escribió:

no Marze, no fue tan fácil, ya que no se nada de ajax, y apenas

puedes hacerlo tu mismo no?

El 30/05/2007, a las 1:53, William B. escribió:

On 30/05/07, William B. [email protected] wrote:

no Marze, no fue tan fácil, ya que no se nada de ajax, y apenas aprendo
rails. me lance a hacer algo antes de tiempo y me pesó, pero bueno ahi
vamos.

quiero mas a delante optimizarlas.

En cualquier caso, recordad siempre la necesidad de que la
funcionalidad esté disponible sin javascript.

Para eso, el proceso correcto practicamente siempre es crear la
funcionalidad SIN RECURRIR A AJAX (varias páginas, recargas, etc.) y
luego sobre eso mejorar con Ajax donde sea apropiado / necesario.

En mi caso encuentro que modelar la funcionalidad sin javascript
primero me ayuda a comprender exactamente dónde y para qué debe
utilizarse el javascript y me facilita la
implementación.

Manuel, que
piensa que eres una excelente persona y medra en torno a
http://simplelogica.net y/o simplelogica.net
Recuerda comer mucha fruta y verdura.

El 30/05/2007, a las 14:43, William B. escribió:

aveces he
querido volver a java

no hay razón para hacerlo, cuando ves la belleza de ruby no vuelves

:slight_smile:

marze

Gracias Marze.

no conocia los railcast, voy a pegarles una ojeada, parece interesante.

la verdad es que la curva de aprendizaje ha sido dura y aveces he
querido volver a java, pero bueno vamos para adelante y rails enamora,
nos va volviendo adictos.

Cordial saludo desde Colombia

hola espero q me puedas ayudar realmente ya no se como hacer , e probado
de todas las formas pero aun hay algo q no se q es pero ni siquiera se
ma cargan los dos combos restantes.
Este es my codigo

///// controlador

def geo_countrie_update
return unless request.xhr?
geo_states = GeoState.find(:all, :conditions =>
[“geo_countrie_con_id=?”, params[:geo_countrie_con_id]] )
render :update do |page|
page << update_select_box( “geo_state_sta_id”,
geo_states,
{:text => :name,
:clear => [‘geo_citie_cty_id’]} )
end
end

def geo_state_update
return unless request.xhr?
geo_cities = GeoCitie.find( :all, :conditions =>
[“geo_state_sta_id=?”, params[:geo_state_sta_id]])
render :update do |page|
page << update_select_box( “geo_citie_cty_id”,
geo_cities,
{:text => :name} )
end
end

------ vista

Register Profile

<% form_tag do %>
<%= select( “geo_countrie”, “con_id”, GeoCountrie.find(:all).collect{
|l1| [l1.name, l1.con_id] } ) %>
<%= select( “geo_state”, “sta_id”, [] ) %>
<%= select( “geo_citie”, “cty_id”, [] ) %>
<%= submit_tag %>

<%= observe_field “geo_countrie_con_id”,
{:url => {:action => ‘geo_countrie_update’},
:with => “geo_countrie_con_id”} %>

<%= observe_field “geo_state_sta_id”,
{:url => {:action => ‘geo_state_update’},
:with => “geo_state_sta_id” } %>
<% end %>

////// aplication_helper
def update_select_box( target_dom_id, collection, options={} )

Set the default options

options[:text] ||= ‘name’
options[:value] ||= ‘id’
options[:include_blank] ||= true
options[:clear] ||= []
pre = options[:include_blank] ? [[’’,’’]] : []

out = “update_select_options( $(’” << target_dom_id.to_s << “’),”
out << “#{(pre + collection.collect{ |c| [c.send(options[:text]),
c.send(options[:value])]}).to_json}” << “,”
out << “#{options[:clear].to_json} )”
end

///// js

function update_select_options( target, opts_array, clear_select_list )
{

if( $(target).type.match("select" ) ){ // Confirm the target is a 

select box
// Remove existing options from the target and the
clear_select_list
clear_select_list[clear_select_list.length] = target // Include
the target in the clear list

    for( k=0;k < clear_select_list.length;k++){
        obj = $(clear_select_list[k]);
        if( obj.type.match("select") ){
            len = obj.childNodes.length;
            for( var i=0;i < 

len;i++){obj.removeChild(obj.firstChild);}
}
}

    // Populate the new options
    for(i=0;i < opts_array.length;i++){
        o = document.createElement( "option" );
        o.appendChild( document.createTextNode( opts_array[i][0] ) 

);
o.setAttribute( “value”, opts_array[i][1] );
obj.appendChild(o);
}
}
}

Ojala puedas ayudarme, te estaria muy agradecida

Saludos

andrea

Creo que no estas utilizando la nomenclatura que recomienda rails para
el nombre de los objetos, y el helper el referencia estos campos:

options[:text] ||= ‘name’
options[:value] ||= ‘id’

a mi me paso lo mismo, corregi y me funciono.

en los selects:

<%= select( “geo_state”, “sta_id”, [] ) %>
<%= select( “geo_citie”, “cty_id”, [] ) %>

asi me funcionó.

<%= select( “objeto”, “id”, [] ) %>

eso es lo que veo por encima.

saludos