Ruby on rails RubyonRails-jQuery在添加太多项时会抛出拖放排序顺序

Ruby on rails RubyonRails-jQuery在添加太多项时会抛出拖放排序顺序,ruby-on-rails,jquery-ui,drag-and-drop,jquery-ui-sortable,Ruby On Rails,Jquery Ui,Drag And Drop,Jquery Ui Sortable,我正在通过jQuery UI构建一个拖放列表,用户可以在其中拖动一个项目(类别)列表,一旦拖动了一个项目,整个项目就会被序列化并作为参数/params[:category]传递给控制器中的“sort”函数,以索引每个项目并更新其位置。为了尽可能地简化这一过程,以便找出下面的bug,我现在实际上是在javascript中手动设置字符串。(我的javascript、视图和控制器代码在下面这篇文章的末尾) 问题出在这里。只要有五个项目,它就工作得很好。控制台输出 Started POST "/cate

我正在通过jQuery UI构建一个拖放列表,用户可以在其中拖动一个项目(类别)列表,一旦拖动了一个项目,整个项目就会被序列化并作为参数/params[:category]传递给控制器中的“sort”函数,以索引每个项目并更新其位置。为了尽可能地简化这一过程,以便找出下面的bug,我现在实际上是在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'部分,并在前面删除一些,则无论发生什么情况,数字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>
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
categories\u controller.rb

<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>
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

我终于能够通过这条线索解释为什么会发生这种情况:

我正在运行REE 1.8.7,因此我的参数没有被排序。我能够解决这个问题,在我的排序控制器函数中用索引行替换每个索引行

params[:category].sort { |a, b| a <=> b }.each_with_index do |id, index|
params[:category]。排序{| a,b | a b}。每个带有|索引do | id的| u,索引|

参数在函数内部重新调用,现在以正确的顺序更新数据库。

此外,在真实版本的代码中,我试图排序的数字列是模式中的字符串而不是整数,这也没有什么帮助。