Ruby on rails - PUT method on update ajax

14,276

Rails determines the put request via the parameter _method with the value 'put'.

As not all the browsers support the put method, rails cheats in the form_tag. its putting this output in a PUT form:

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

So what you have to do is this:

$.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 );
        });
Share:
14,276
user1560922
Author by

user1560922

Updated on June 30, 2022

Comments

  • user1560922
    user1560922 almost 2 years

    Could someone tell me why this PUT method doesn't work please.

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

    Server says that I have used the GET method but in my ajax request I have type: "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 have tried adding _method: 'put' But it's still the same

    $.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 );
                });
    

    Server:

    "resource%5Bpos_y%5D=45&resource%5Bpos_x%5D=50&method=put&=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'd appreciate any help.

  • jmoon90
    jmoon90 over 8 years
    hey that works great. Can you explain to me why we're converting the hash to a JSON string? JSON.stringify