2012-08-03 25 views
9

¿Podría alguien decirme por qué este método PUT no funciona, por favor?Ruby on rails - método PUT en la actualización ajax

$.ajax({ 
     type: "PUT", 
     dataType: "script", 
     url: '/resources/35', 
     data: 
     { 
      resource : { pos_y: 45, pos_x: 50 } 
     } 
    }).done(function(msg) 
      { 
       alert("Data Saved: " + msg); 
      }); 

servidor dice que he utilizado el método GET pero en mi petición ajax tengo tipo: "PUT"

Started GET "/resources/35?resource%5Bpos_y%5D=45&resource%5Bpos_x%5D=50&_=1344001820350" for 192.168.1.89 at 2012-08-03 15:50:20 +0200 
Processing by ResourcesController#show as */* 
    Parameters: {"resource"=>{"pos_y"=>"45", "pos_x"=>"50"}, "_"=>"1344001820350", "id"=>"35"} 
    User Load (0.3ms) SELECT "users".* FROM "users" 
    Resource Load (0.1ms) SELECT "resources".* FROM "resources" WHERE "resources"."id" = ? LIMIT 1 [["id", "35"]] 
    Rendered resources/show.html.erb within layouts/login (2.3ms) 
Completed 200 OK in 238ms (Views: 235.9ms | ActiveRecord: 0.4ms) 

resources_controller.rb

# PUT /resources/1                                        
    # PUT /resources/1.json                                       
    def update 
    @resource = Resource.find(params[:id]) 

    respond_to do |format| 
     if @resource.update_attributes(params[:resource]) 
     format.html { redirect_to @resource, notice: 'successfully updated.' } 
     format.js 
     else 
     format.html { render action: "edit" } 
     format.js 
     end 
    end 
    end 

I intenté agregar _method: 'put' Pero sigue siendo el mismo

$.ajax({ 
     type: "PUT", 
     dataType: "script", 
     url: '/resources/35', 
     data: 
     { 
      resource : { pos_y: 45, pos_x: 50 }, 
      _method: 'put' 
     } 
    }).done(function(msg) 
      { 
       alert("Data Saved: " + msg); 
      }); 

Servidor:

"recurso% 5Bpos_y% 5D = 45 & recurso% 5Bpos_x% 5D = 50 & method = puse & = 1344004390840"

Started GET "/resources/35?resource%5Bpos_y%5D=45&resource%5Bpos_x%5D=50&_method=put&_=1344004390840" for 192.168.1.89 at 2012-08-03 16:33:10 +0200 
Processing by ResourcesController#show as */* 
    Parameters: {"resource"=>{"pos_y"=>"45", "pos_x"=>"50"}, "_"=>"1344004390840", "id"=>"35"} 
    User Load (0.3ms) SELECT "users".* FROM "users" 
    Resource Load (0.1ms) SELECT "resources".* FROM "resources" WHERE "resources"."id" = ? LIMIT 1 [["id", "35"]] 
    Rendered resources/show.html.erb within layouts/login (0.8ms) 
Completed 200 OK in 93ms (Views: 90.5ms | ActiveRecord: 0.4ms) 

I' agradecería cualquier ayuda.

+0

¿Qué navegador usas? – Vodun

+0

¿Te refieres a POST, no PUT? .... –

+0

Actualicé mi respuesta. Podrías probar eso :-) –

Respuesta

25

Rails determina la solicitud de envío a través del parámetro _method con el valor 'put'.

Como no todos los navegadores son compatibles con el método put, Rails realiza trampas en form_tag. su puesta esta salida en una forma PUT:

<input type='hidden' name='_method' value='put'> 

Así que lo que tiene que hacer es esto:

$.ajax({ 
    type: "POST", 
    dataType: "script", 
    url: '/resources/35', 
    contentType: 'application/json', 
    data: JSON.stringify({ resource:{pos_y:45,pos_x:50}, _method:'put' }) 
}).done(function(msg) 
     { 
      alert("Data Saved: " + msg); 
     }); 
+0

Awesome, '_method:' put '' ¡resolvió mi problema! – gamov

+2

hey que funciona muy bien. ¿Puedes explicarme por qué estamos convirtiendo el hash en una cadena JSON? 'JSON.stringify' – jmoon90