Я создаю список перетаскивания с помощью пользовательского интерфейса jQuery, где пользователи могут перетаскивать список элементов (категорий), и как только элемент перетаскивается, все это сериализуется и передается в «сортировку». функционируют в контроллере как параметры / параметры [: категория] для индексации каждого элемента и обновления его позиции. Чтобы максимально упростить это, чтобы попытаться выследить следующую ошибку, на самом деле я сейчас вручную устанавливаю строку в javascript. (Мой код javascript, view и controller находится в конце этого поста ниже).
Вот проблема. С чем угодно, до пяти предметов, это прекрасно работает. Консольные выходы ...
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