Ruby on Rails - порядок сортировки перетаскивания jQuery сбрасывается, когда добавляется слишком много элементов

Я создаю список перетаскивания через пользовательский интерфейс jQuery, где пользователи могут перетаскивать список элементов (категорий), и как только элемент перетаскивается, все это сериализуется и передается функции «сортировки» в контроллер в качестве параметров/параметров[:категория] для индексации каждого элемента и обновления его позиции. Чтобы максимально упростить это, чтобы попытаться найти следующую ошибку, я на самом деле сейчас вручную устанавливаю строку в javascript. (Мой код javascript, представления и контроллера находится в конце этого поста ниже).

Вот в чем проблема. С чем-либо до пяти элементов это работает прекрасно. Выходы консоли...

Started POST "/categories/sort" for 127.0.0.1 at Wed May 11 12:03:04 -0500 2011
  Processing by CategoriesController#sort as 
  Parameters: {"category"=>{"1"=>{"id"=>"1"}, "2"=>{"id"=>"2"}, "3"=>{"id"=>"3"}, "4"=>{"id"=>"4"}, "5"=>{"id"=>"5"}}}
  Category Load (0.3ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = 1 LIMIT 1
  AREL (0.5ms)  UPDATE "categories" SET "position" = 1, "updated_at" = '2011-05-11 17:03:04.412058' WHERE "categories"."id" = 1
  Category Load (0.3ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = 2 LIMIT 1
  AREL (0.4ms)  UPDATE "categories" SET "position" = 2, "updated_at" = '2011-05-11 17:03:04.416833' WHERE "categories"."id" = 2
[...]

Однако по какой-то абсолютно безумной причине добавьте в эту строку шестой элемент/категорию, и внезапно результаты станут такими...

Started POST "/categories/sort" for 127.0.0.1 at Wed May 11 12:12:35 -0500 2011
  Processing by CategoriesController#sort as 
  Parameters: {"category"=>{"6"=>{"id"=>"6"}, "1"=>{"id"=>"1"}, "2"=>{"id"=>"2"}, "3"=>{"id"=>"3"}, "4"=>{"id"=>"4"}, "5"=>{"id"=>"5"}}}
  Category Load (0.2ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = 6 LIMIT 1
  AREL (0.4ms)  UPDATE "categories" SET "position" = 1, "updated_at" = '2011-05-11 17:12:35.358963' WHERE "categories"."id" = 6
  Category Load (0.2ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = 1 LIMIT 1
  AREL (0.2ms)  UPDATE "categories" SET "position" = 2, "updated_at" = '2011-05-11 17:12:35.362330' WHERE "categories"."id" = 1
  Category Load (0.1ms)  SELECT "categories".* FROM "categories" WHERE "categories"."id" = 2 LIMIT 1
[...]

Как вы можете видеть, при добавлении категории номер шесть параметры для этой категории заканчиваются и становятся первым элементом в списке, с которым выполняется цикл по индексу, полностью нарушая правильный порядок. Что еще более безумно, так это то, что если я оставлю часть «category[6][id]=6» в строке параметров и уберу несколько перед ней, номер шесть всегда будет первым, несмотря ни на что.

Это не имеет абсолютно никакого смысла, и единственное, что я могу понять, это то, что я неправильно форматирую строку параметров в javascript. Что я делаю не так?


index.html.erb

<ul id="categories">
   <li id="category_1"><div class="handle"></div>One</li>
   <li id="category_2"><div class="handle"></div>Two</li>
   <li id="category_3"><div class="handle"></div>Three</li>
   <li id="category_3"><div class="handle"></div>Four</li>
   <li id="category_3"><div class="handle"></div>Five</li>
   <li id="category_3"><div class="handle"></div>Six</li>
</ul>

application.js

$("#categories").sortable({
   opacity: 0.6,
   handle: '.handle',
   update: function(event, ui) {
       var parameters = 'category[1][id]=1&category[2][id]=2&category[3][id]=3&category[4][id]=4&category[5][id]=5&category[6][id]=6';
       $.post("/categories/sort", parameters);
   }
});

categories_controller.rb

def sort
  params[:category].each_with_index do |id, index|
    category_id = id[1][:id]
    Category.update(category_id, :position => index + 1)
  end
  render :nothing => true
end

person Shannon    schedule 11.05.2011    source источник


Ответы (1)


Я смог, наконец, пролить свет на то, почему это происходит в этой ветке: that-can-select-them-by-their-has">Мои хэши складываются неупорядоченно.. Что за цикл, который может выбрать их по их хэш-идентификатору?

Я использую REE 1.8.7, поэтому мой параметр не сортируется. Мне удалось решить проблему, заменив строку each_with_index в моей функции контроллера сортировки на это...

params[:category].sort { |a, b| a <=> b }.each_with_index do |id, index|

Параметры перебираются внутри функции и теперь обновляют базу данных в правильном порядке.

person Shannon    schedule 11.05.2011
comment
Кроме того, также не помогло то, что числовой столбец, по которому я пытался отсортировать в реальной версии моего кода, был строкой в ​​схеме, а не целым числом. - person Shannon; 12.05.2011