Problemas observe_field - crea registros en tabla de modelo

Hola foro :

Estoy desarrollando una aplicación donde tenía pensado poner un buscador
con ajax utilizando observe_field sobre un modelo Paciente, este modelo
está anidado con otros modelos.


map.resources :pacientes do |paciente|
paciente.resources :gacelas
paciente.resources :tratamientos, :member => { :quitar => :put }
,:collection => {:todos => :get , :informe => :get}
paciente.resources :tareas
end

En la vista del modelo Paciente, inserto el formulario y el observador :



BUSCADOR

Inserte parametro busqueda : <%= text_field_tag("query", params['query'], :size => 10 ) %>
    <%= image_tag("spinner.gif",
                  :align => "absmiddle",
                  :border => 0,
                  :id => "spinner",
                  :style =>"display: none;" ) %>
    </p>

    <%= observe_field 'query',  :frequency => 1,
             :update => 'actualizable',
             :before => "Element.show('spinner')",
             :success => "Element.hide('spinner')",
             :url => {:action => 'index'},
             :with => 'query' %>


 </div>

En el controlador de Paciente, el metodo index :


def index

      items_per_page = 10

      sort = case params['sort']
             when "name"  then "name"
             when "qty"   then "quantity"
             when "price" then "price"
             when "name_reverse"  then "name DESC"
             when "qty_reverse"   then "quantity DESC"
             when "price_reverse" then "price DESC"
             end

      conditions = ["login LIKE ?", "%#{params[:query]}%"] unless

params[:query].nil?

      @total = User.count(:conditions => conditions)
      @pacientes = User.paginate :page => params[:page], :order =>

sort, :conditions => conditions, :per_page => items_per_page

      if request.xml_http_request?
        render :partial => "pacientes_lista", :layout => false
        #render :partial => "index", :layout => false

      end

Pues no hay manera, llevo toda la noche mirando , y empieza a hacer la
busqueda, es decir, si tengo un registro de nombre Mikel, según empiezo
a poner la letra M, el javascript entra en acción , y en vez de buscar ,
veo que empieza a crear campos null en la base de datos…

Lo cojonudo , es que si pongo el nombre exacto en el campo y le doy a
enter, me lo encuentra y no pasa nada, si no le doy al enter, empieza a
hacer crear registros y en el metodo create , hago que me redireccione a
otra pagina, entonces, se me vuelve loco.

Gracias

El día 29 de junio de 2008 4:02, David V.
[email protected]
escribió:>

Pues no hay manera, llevo toda la noche mirando , y empieza a hacer la
busqueda, es decir, si tengo un registro de nombre Mikel, según empiezo
a poner la letra M, el javascript entra en acción , y en vez de buscar ,
veo que empieza a crear campos null en la base de datos…

No me hagas mucho caso… pero: ¿puede ser que se esté invocando a la
acción del Controller equivocada?

No sé… igual a la create o algo, por algún rollo raro de routes.rb

Suerte
f.

Fernando G. wrote:

El d�a 29 de junio de 2008 4:02, David V.
[email protected]
escribi�:>
Pues no hay manera, llevo toda la noche mirando , y empieza a hacer la

busqueda, es decir, si tengo un registro de nombre Mikel, seg�n empiezo
a poner la letra M, el javascript entra en acci�n , y en vez de buscar ,
veo que empieza a crear campos null en la base de datos…

No me hagas mucho caso… pero: �puede ser que se est� invocando a la
acci�n del Controller equivocada?

No s�… igual a la create o algo, por alg�n rollo raro de routes.rb

Suerte
f.

Por ahí también pienso yo que van los tiros, pero lo único que tengo en
routes es la parte que he copiado arriba :


map.resources :pacientes do |paciente|
paciente.resources :gacelas
paciente.resources :tratamientos, :member => { :quitar => :put }
,:collection => {:todos => :get , :informe => :get}
paciente.resources :tareas
end

y la parte pacientes , genera con rake routes lo siguiente :


pacientes GET /pacientes
{:action=>“index”, :controller=>“pacientes”}
formatted_pacientes GET /pacientes.:format
{:action=>“index”, :controller=>“pacientes”}
POST /pacientes
{:action=>“create”, :controller=>“pacientes”}
POST /pacientes.:format
{:action=>“create”, :controller=>“pacientes”}
new_paciente GET /pacientes/new
{:action=>“new”, :controller=>“pacientes”}
formatted_new_paciente GET /pacientes/new.:format
{:action=>“new”, :controller=>“pacientes”}
edit_paciente GET /pacientes/:id/edit
{:action=>“edit”, :controller=>“pacientes”}
formatted_edit_paciente GET
/pacientes/:id/edit.:format
{:action=>“edit”, :controller=>“pacientes”}
paciente GET /pacientes/:id
{:action=>“show”, :controller=>“pacientes”}
formatted_paciente GET /pacientes/:id.:format
{:action=>“show”, :controller=>“pacientes”}
PUT /pacientes/:id
{:action=>“update”, :controller=>“pacientes”}
PUT /pacientes/:id.:format
{:action=>“update”, :controller=>“pacientes”}
DELETE /pacientes/:id
{:action=>“destroy”, :controller=>“pacientes”}
DELETE /pacientes/:id.:format

Lo único que se me ocurre, es que el javascript esté pasando
continuamente peticiones POST…pero ese mismo codigo , sobre otro
modelo y controlador, funciona correctamente, entonces, me rommpe todos
los esquemas…

Al haber declarado Paciente como resource, automaticamente rails le
asigna
el comportamiento por defecto de los recursos REST, es decir que una
petición por post a /pacientes se mapea a create. Así que la diferencia
entre las peticiones a index y a create es simplemente el método por el
que
llega la petición: get va a index y por post va a create.

En tu observ_field has declarado la url así: :url=>{:action=> create} ,
pues
bien, eso no esta enviando la petición a la acción index, sino a la url
de
la acción index, que es la misma que la de create, así que si los datos
van
por post(que es la opción por defecto de las llamadas Ajax de
prototype),
llegan a create.

Sí como dices ese mismo código funciona perfectamente en otro
controlador
seguramente es porque en ese otro caso no se trata de un recurso rest
que
tengas declarado en el routes como resource.

Así que la solución es fácil, o envias la petición a una acción
diferente, o
le dices al Ajax que method=>get
Otra opción es utilizar el plugin auto_complete

Salu2!
Juanjo

2008/6/29 David V. [email protected]:

Ese juanjo bueno al rescate :slight_smile:

El día 29 de junio de 2008 12:07, Juanjo Bazán [email protected]
escribió:

por post(que es la opción por defecto de las llamadas Ajax de prototype),
Salu2!

busqueda, es decir, si tengo un registro de nombre Mikel, seg�n empiezo
f.
end
{:action=>“create”, :controller=>“pacientes”}
{:action=>“edit”, :controller=>“pacientes”}
DELETE /pacientes/:id.:format
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Fernando Guillén
Desarrollador Web Freelance

Fernando G. wrote:

Ese juanjo bueno al rescate :slight_smile:

El día 29 de junio de 2008 12:07, Juanjo Bazán [email protected]
escribió:

por post(que es la opción por defecto de las llamadas Ajax de prototype),
Salu2!

busqueda, es decir, si tengo un registro de nombre Mikel, seg�n empiezo
f.
end
{:action=>“create”, :controller=>“pacientes”}
{:action=>“edit”, :controller=>“pacientes”}
DELETE /pacientes/:id.:format
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es


Fernando Guillén
Desarrollador Web Freelance
http://www.fernandoguillen.info

Perfecto, tenías razón. Era ese el problema, he creado una nueva ruta en
routes para un nuevo metodo , que hace lo mismo que hacía en el index y
funciona perfectamente.

Gracias