Forum: Rails-ES Problema comportamiento after_update_element en model_auto_completer

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
9baec5b20d55fcdced48dadd94d96db5?d=identicon&s=25 Jaime Mora Ramones (Guest)
on 2008-10-20 03:51
(Received via mailing list)
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

<ul>
 <% for paciente in @pacientes %>
  <li id="paciente_<%= paciente.id %>" nombre_completo="<%=
paciente.nombre_completo %>">
   <%=h paciente.nombre_completo_with_edad %>
  </li>
 <% end %>
</ul>

#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.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2008-10-20 12:17
(Received via mailing list)
On Mon, Oct 20, 2008 at 3:51 AM, Jaime Mora Ramones
<jaime.mora.ramones@gmail.com> wrote:


> <%= belongs_to_auto_completer :consulta, :paciente, :nombre_completo, {
> :after_update_element => "after_consulta_paciente" } %>
>
> #views/_consulta_paciente_completions.html.erb
>
> <ul>
>  <% for paciente in @pacientes %>
>   <li id="paciente_<%= paciente.id %>" nombre_completo="<%=
> paciente.nombre_completo %>">

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?
9baec5b20d55fcdced48dadd94d96db5?d=identicon&s=25 Jaime Mora Ramones (Guest)
on 2008-10-20 17:06
(Received via mailing list)
El 20 de octubre de 2008 4:17, Xavier Noria <fxn@hashref.com> 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.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2008-10-20 17:37
(Received via mailing list)
On Mon, Oct 20, 2008 at 5:05 PM, Jaime Mora Ramones
<jaime.mora.ramones@gmail.com> 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 "&amp;". 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.
9baec5b20d55fcdced48dadd94d96db5?d=identicon&s=25 Jaime Mora Ramones (Guest)
on 2008-10-20 18:17
(Received via mailing list)
El 20 de octubre de 2008 9:36, Xavier Noria <fxn@hashref.com> 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.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2008-10-20 20:38
(Received via mailing list)
On Mon, Oct 20, 2008 at 6:17 PM, Jaime Mora Ramones
<jaime.mora.ramones@gmail.com> 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;
9baec5b20d55fcdced48dadd94d96db5?d=identicon&s=25 Jaime Mora Ramones (Guest)
on 2008-10-20 22:45
(Received via mailing list)
El 20 de octubre de 2008 12:38, Xavier Noria <fxn@hashref.com> 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
9baec5b20d55fcdced48dadd94d96db5?d=identicon&s=25 Jaime Mora Ramones (Guest)
on 2008-10-20 23:29
(Received via mailing list)
El 20 de octubre de 2008 12:38, Xavier Noria <fxn@hashref.com> 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.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2008-10-20 23:44
(Received via mailing list)
On Mon, Oct 20, 2008 at 11:28 PM, Jaime Mora Ramones
<jaime.mora.ramones@gmail.com> 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.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2008-10-21 06:22
(Received via mailing list)
2008/10/20 Xavier Noria <fxn@hashref.com>:

> 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

   <span class="extract-me">...</span>

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.
9baec5b20d55fcdced48dadd94d96db5?d=identicon&s=25 Jaime Mora Ramones (Guest)
on 2008-10-21 06:32
(Received via mailing list)
El 20 de octubre de 2008 22:21, Xavier Noria <fxn@hashref.com> 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
;)

Gracias por la ayuda como siempre.
Un saludo
9baec5b20d55fcdced48dadd94d96db5?d=identicon&s=25 Jaime Mora Ramones (Guest)
on 2008-10-21 21:29
(Received via mailing list)
El 20 de octubre de 2008 22:21, Xavier Noria <fxn@hashref.com> 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

<ul>
    <% for paciente in @pacientes %>
        <li id=<%= dom_id(paciente) %> edad="<%= h
Paciente.edad_with_caption(paciente) %>">
            <%= h paciente.nombre_completo_with_edad %>
            <span class="extract-me" style="display:none;"><%= h
paciente.nombre_completo %></span>
        </li>
    <% end %>
</ul>

# javascripts/application.js

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


Un saludo.
7223c62b7310e164eb79c740188abbda?d=identicon&s=25 Xavier Noria (fxn)
on 2008-10-21 21:29
(Received via mailing list)
Genial :-)
This topic is locked and can not be replied to.