Problema comportamiento after_update_element en model_auto_completer


#1

Cuando el usuario presiona Enter se obtiene el comportamiento deseado,
sin
embargo cuando el usuario utiliza el ratón para seleccionar un item no
es el
esperado :

#views/_form.html.erb

<%= belongs_to_auto_completer :consulta, :paciente, :nombre_completo, {
:after_update_element => “after_consulta_paciente” } %>

#views/_consulta_paciente_completions.html.erb

    <% for paciente in @pacientes %>
  • <%=h paciente.nombre_completo_with_edad %>
  • <% end %>

#javascripts/application.js

function after_consulta_paciente(element, selected, hf, model_id) {
$(“paciente[nombre_completo]”).value =
selected.getAttribute(“nombre_completo”);
}

Cuando el usuario utiliza el ratón el control model_auto_completer se
refresca con el valor del item seleccionado y debería hacerlo con la
variable nombre_completo, como les comentaba funciona bien cuando el
usuario
presiona Enter para seleccionar.

Gracias por la ayuda.

Un saludo.


#2

On Mon, Oct 20, 2008 at 3:51 AM, Jaime Mora R.
removed_email_address@domain.invalid wrote:

<%= belongs_to_auto_completer :consulta, :paciente, :nombre_completo, {
:after_update_element => “after_consulta_paciente” } %>

#views/_consulta_paciente_completions.html.erb

    <% for paciente in @pacientes %>

Dos cositas ahi: no se si conoces dom_id(paciente) que se introdujo en
Rails 2, y posiblemente se necesite una h() para
paciente.nombre_completo.

function after_consulta_paciente(element, selected, hf, model_id) {
$(“paciente[nombre_completo]”).value =

Seguro que “paciente[nombre_completo]” es el ID del campo?


#3

El 20 de octubre de 2008 4:17, Xavier N. removed_email_address@domain.invalid escribió:

Dos cositas ahi: no se si conoces dom_id(paciente) que se introdujo en
Rails 2, y posiblemente se necesite una h() para
paciente.nombre_completo.

Seguro que “paciente[nombre_completo]” es el ID del campo?


Desconocia el dom_id helper, gracias. Entiendo que el método h() es para
prevenir cross-site scripting hacks (XSS), mi duda es debo utilizarlo
únicamente en las descripciones de las urls ó también debo usarlo en
todas
las evaluaciones de campos string de los modelos en la vista ?

Con respecto a tu pregunta del ID del campo, estoy utilizando el name
del
control model_auto_completer porque recuerda que el id es aleatorio. el
selector $() del prototype lo está tomando correctamente ya que funciona
bien cuando el usuario utiliza el teclado para seleccionar el item, el
problema se presenta cuando utiliza el ratón para seleccionar.

Gracias por la ayuda.
Un saludo.


#4

El 20 de octubre de 2008 9:36, Xavier N. removed_email_address@domain.invalid escribió:

En resumen, hay que pasar por h() tanto contenido como valores de
atributos.

Entendido, gracias.

Lo que estas haciendo es raro de todos modos. El text_field lo recibes
como primer argumento del callback directamente, no es necesario que
lo busques, pero por que quieres asignarle un valor? El caso de uso
normal es que lo pones en los LIs, y el plugin pone lo que alli haya
sin que tengas que hacer nada especial.

En los LIs necesito concatenar la edad al nombre completo, pero una vez
seleccionado necesito asignarle al text_field unicamente el nombre
completo
y en un text_field independiente asignar la edad.

Cómo obtengo el ID del text_field model_auto_completer ?

Gracias por la ayuda.
Un saludo.


#5

On Mon, Oct 20, 2008 at 5:05 PM, Jaime Mora R.
removed_email_address@domain.invalid wrote:

Desconocia el dom_id helper, gracias. Entiendo que el método h() es para
prevenir cross-site scripting hacks (XSS), mi duda es debo utilizarlo
únicamente en las descripciones de las urls ó también debo usarlo en todas
las evaluaciones de campos string de los modelos en la vista ?

h() hay que usarlo para echar HTML bien formado. El valor de un
atributo HTML se escapa igual que el texto.

Por ejemplo una URL en href no puede tener un “&” tal cual, debe
escaparse como “&”. En un onclick tampoco puede estar el operador
JavaScript “<” pelado. Los navegadores se lo tragan, pero eso es otro
tema, un HTML asi no esta bien formado.

En resumen, hay que pasar por h() tanto contenido como valores de
atributos.

Con respecto a tu pregunta del ID del campo, estoy utilizando el name del
control model_auto_completer porque recuerda que el id es aleatorio. el
selector $() del prototype lo está tomando correctamente ya que funciona
bien cuando el usuario utiliza el teclado para seleccionar el item, el
problema se presenta cuando utiliza el ratón para seleccionar.

Ahi hay algo raro.

Por un lado eso esta delegado en el plugin auto_complete y esta
probado en Safari/Firefox/IE con teclado y raton.

Por otro lado, $() por debajo llama a getElementById() y no busca
nombres de atributos. Si te esta haciendo algo con el teclado hay un
expediente X del estilo no editar lo que estoy ejecutando o algo asi,
porque $(name) no funciona.

Lo que estas haciendo es raro de todos modos. El text_field lo recibes
como primer argumento del callback directamente, no es necesario que
lo busques, pero por que quieres asignarle un valor? El caso de uso
normal es que lo pones en los LIs, y el plugin pone lo que alli haya
sin que tengas que hacer nada especial.


#6

El 20 de octubre de 2008 12:38, Xavier N. removed_email_address@domain.invalid escribió:

El text_field es el primer argumento de la llamada al callback

1erargumento.value = algo;

Es correcto.

function after_consulta_paciente(element, selected, hf, model_id) {
element.value = selected.getAttribute(“nombre_completo”);
}

El problema persiste. Posiblemente la respuesta se encuentre en el mismo
plugin auto_complete. Obtengo el mismo resultado con Firefox e Internet
Explorer.

Gracias por la ayuda.
Un saludo


#7

On Mon, Oct 20, 2008 at 6:17 PM, Jaime Mora R.
removed_email_address@domain.invalid wrote:

En los LIs necesito concatenar la edad al nombre completo, pero una vez
seleccionado necesito asignarle al text_field unicamente el nombre completo
y en un text_field independiente asignar la edad.

Cómo obtengo el ID del text_field model_auto_completer ?

El text_field es el primer argumento de la llamada al callback

1erargumento.value = algo;

#8

El 20 de octubre de 2008 12:38, Xavier N. removed_email_address@domain.invalid escribió:

El text_field es el primer argumento de la llamada al callback

Solucionado. Simplemente asigné el mismo valor al caché de
model_auto_completer :

function after_consulta_paciente(element, selected, hf, model_id) {
element.value = selected.getAttribute(“nombre_completo”);
element.model_auto_completer_cache =
selected.getAttribute(“nombre_completo”);
}

Gracias por la ayuda.
Un saludo.


#9

On Mon, Oct 20, 2008 at 11:28 PM, Jaime Mora R.
removed_email_address@domain.invalid wrote:

Solucionado. Simplemente asigné el mismo valor al caché de
model_auto_completer :

function after_consulta_paciente(element, selected, hf, model_id) {
element.value = selected.getAttribute(“nombre_completo”);
element.model_auto_completer_cache =
selected.getAttribute(“nombre_completo”);
}

Bien!

El plugin necesita recordar el valor del campo para decidir si el
usuario lo edito a mano o no (salvo :allow_free_text). Al trastear con
el valor del campo has necesitado mantener esa memoria a mano porque
se trata de un caso de uso no previsto.

Trataré de pensar un modo de soportarlo, :extract_value_with =>
function opcional o algo asi.


#10

2008/10/20 Xavier N. removed_email_address@domain.invalid:

El plugin necesita recordar el valor del campo para decidir si el
usuario lo edito a mano o no (salvo :allow_free_text). Al trastear con
el valor del campo has necesitado mantener esa memoria a mano porque
se trata de un caso de uso no previsto.

Trataré de pensar un modo de soportarlo, :extract_value_with =>
function opcional o algo asi.

Visto: Revisando auto_complete ya tiene esa funcionalidad en la opcion
:select.

La idea es que la parte de la cadena que quieres que termine en el
campo de texto la pones por ejemplo en un SPAN con una clase especial
que marca lo que quieres extraer

y en el hash de mas a la derecha de todo en la llamada al helper
(“completion_options”) pasas

<%= belongs_to_auto_completer …, :select => ‘extract-me’ %>

Mirate la signatura, van 3 hashes al final, puede que tengas que
explicitar alguno vacio con {} si no lo usabas.


#11

El 20 de octubre de 2008 22:21, Xavier N. removed_email_address@domain.invalid escribió:

y en el hash de mas a la derecha de todo en la llamada al helper
(“completion_options”) pasas

<%= belongs_to_auto_completer …, :select => ‘extract-me’ %>

Mirate la signatura, van 3 hashes al final, puede que tengas que
explicitar alguno vacio con {} si no lo usabas.

Gracias Xavi ! Mañana temprano lo voy a probar, por aca es media noche,
y
por alla contigo peor, trataré de dormir, te recomiendo que hagas lo
mismo
:wink:

Gracias por la ayuda como siempre.
Un saludo


#12

El 20 de octubre de 2008 22:21, Xavier N. removed_email_address@domain.invalid escribió:

Visto: Revisando auto_complete ya tiene esa funcionalidad en la opcion
:select.

Funcionó, gracias Xavi, Muy bien ! Comparto la versión final :

views/_form.html.erb

<%= belongs_to_auto_completer :consulta, :paciente, :nombre_completo,
{ :after_update_element => “after_paciente”, :action =>
“auto_complete_for_paciente” }, {}, { :select => “extract-me” } %>

views/shared/_paciente_completions.html.erb

    <% for paciente in @pacientes %>
  • edad="<%= h Paciente.edad_with_caption(paciente) %>"> <%= h paciente.nombre_completo_with_edad %> <%= h paciente.nombre_completo %>
  • <% end %>

javascripts/application.js

function after_paciente(element, selected, hf, model_id) {
$(“paciente_edad”).value = selected.getAttribute(“edad”);
}

Un saludo.


#13

Genial :slight_smile: