RoR, Ajax, сортируемый, Seralize - PullRequest
       22

RoR, Ajax, сортируемый, Seralize

1 голос
/ 12 октября 2011

У меня просто немного "дух", но у меня есть список пунктов меню, которые я сделал сортируемыми и сериализовал данные, используя метод сериализации jquery ui. Я отправляю запрос ajax и вижу следующие параметры в webrick:

Параметры: { "sort" => "menu[]=2&menu[]=3&menu[]=1&menu[]=4" }

В конечном счете, я просто хотел бы иметь список 2,3,1,4 и написать запрос sql для обновления sort_order для этих элементов. Большинство учебных пособий, которые я обнаружил до сих пор, содержали только примеры серверной части PHP, и люди просто набирают params['sort']['menu'], который возвращает 2,3,1,4, но в Ruby, похоже, возвращает пустой объект.

Это мой код jquery:

$(document).ready(function() {
  $(".sortable").sortable({
    update : function (){ 
      $.ajax({
        type  : "POST",
        url   : "/page_parts/sort/",
        data  : {
          sort : $(".sortable").sortable('serialize')
        }
      }); 
    }   
  }); 
});

Это моя разметка:

<ul class="sortable">
  <% @page_parts.each do |f| %>
    <li id="menu_<%= f.id %>"><%= f.title %></li>
  <% end %>
</ul>

Это код моего контроллера:

def sort
  raise params['sort']['menu'].inspect
end 

Это вернется:

Started POST "/page_parts/sort/" for 127.0.0.1 at 2011-10-12 06:19:38 -0400
  Processing by PagePartsController#sort as */*
  Parameters: {"sort"=>"menu[]=1&menu[]=2&menu[]=4&menu[]=3&menu[]=5"}
Completed 500 Internal Server Error in 0ms

RuntimeError ("menu"):
  app/controllers/page_parts_controller.rb:9:in `sort'

Если, с другой стороны, я пытаюсь:

def sort
  raise params['sort'].inspect
end 

Я получаю:

Started POST "/page_parts/sort/" for 127.0.0.1 at 2011-10-12 06:19:10 -0400
  Processing by PagePartsController#sort as */*
  Parameters: {"sort"=>"menu[]=1&menu[]=2&menu[]=3&menu[]=5&menu[]=4"}
Completed 500 Internal Server Error in 0ms

RuntimeError ("menu[]=1&menu[]=2&menu[]=3&menu[]=5&menu[]=4"):

1 Ответ

5 голосов
/ 12 октября 2011

Вот ваша проблема, как я и подозревал:

data  : {
  sort : $(".sortable").sortable('serialize'),
},

serialize возвращает строку, подобную этой: menu[]=2&menu[]=3&menu[]=1&menu[]=4.Затем вы присваиваете эту строку свойству sort в новом объекте и присваиваете этот объект в качестве параметра data.В результате то, что фактически отправляется на сервер в виде POST данных, которые выглядят примерно так:

POST /page_parts/sort/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded

sort=menu%5B%5D%3D2%26menu%5B%5D%3D3%26menu%5B%5D%3D1%26menu%5B%5D%3D4

.. который Rails (правильно) интерпретирует как один параметр sort с декодированным значением menu[]=2&menu[]=3&menu[]=1&menu[]=4.

Видите, куда я иду с этим?Вместо того, чтобы принимать эту сериализованную строку и устанавливать it в качестве значения другого параметра, вам нужно отправить эту сериализованную строку непосредственно на сервер как данные POST.Исправить это легко.Измените ваш $.ajax вызов на:

$.ajax(
  { type  : 'POST',
    url   : '/page_parts/sort/',
    data  : $('.sortable').sortable('serialize') // on its own, no object
  } 
);

Он будет отправлен на сервер так, как вы хотите:

POST /page_parts/sort/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded

menu[]=2&menu[]=3&menu[]=1&menu[]=4

.. и Rails получит то, что вы ожидаете:

>> params
# => { :menu => [ 2, 3, 1, 4 ] }
>> params[:menu]
# => [ 2, 3, 1, 4 ]
...