jQuery-интерфейс для сортировки связанных списков сохранить порядок и ассоциации в модели рельсы
Предположим, что у меня есть: "опрос" со многими "вопросами", который имеет много "ответов"
Если у меня был "опрос", в котором было 2 экземпляра "вопроса" ,назовем их: "Хороший вопрос" и "плохой Вопрос"
"Хороший вопрос" имеет 5 "ответов", а "плохой вопрос" имеет 3 "ответа"
Если "хороший вопрос" и "плохой вопрос" были связаны сортируемые списки с этим взаимодействием jQuery-UI. http://jqueryui.com/sortable/#connect-lists
Я знаю, как отобразить их как 2 сортируемые списки с помощью jQuery-UI, и я также могу отбросить "ответ" от "плохого вопроса" до "хорошего вопроса". Но как бы я сохранил их новые сортированные позиции и их недавно отсортированную ассоциацию в другой "вопрос" обратно в базу данных Rails?
Railscasts имеет способ сохранения позиции для одного сортируемого списка, но не для списков, принадлежащих различным связанным моделям. http://railscasts.com/episodes/147-sortable-lists-revised
Я очень ценю вашу помощь. сюда!
EDIT
Я понял, что мне просто нужно отправить контроллеру Rails идентификатор элемента списка, в который я опустил "ответ" (т. е. <ol class = "connectableSortable" id = "Good_Question"</ol>
)
Это синтаксис для того, как Railscast делает сообщение контроллеру Rails для передачи массива object_id в сортируемом порядке.
jQuery ->
$('#faqs').sortable(
axis: 'y'
update: ->
$.post($(this).data('update-url'), $(this).sortable('serialize'))
)
Как бы я обновил этот пост, чтобы передать ему идентификатор списка, поэтому я могу просто обновить внешний ключ "вопрос" для "ответа" на идентификатор списка, который он упал внутрь?
Этот ответ SO имеет способ получить идентификатор списка. получить элемент / объект, где элемент отброшен
Так что теперь мне действительно нужно знать, как передать дополнительный параметр обратно в контроллер rails. Помощь есть?
1 ответ:
Я был в состоянии выяснить, что я хотел, через пару дней пробиваться через этот. Модель здесь в том, что день имеет много действий (в отличие от исходного вопроса Вопрос имеет много ответов).
Это мой код jQuery (в Coffeescript): Использование селекторов jQuery для получения идентификатора каждого элемента списка и идентификатора столбца каждого элемента списка. Выдвигая его в качестве параметра, который выглядит следующим образом
Activity:[{"id":"1", "column":"1"}, {"id":"2", "column":"1"}...etc]
jQuery -> $('[id*="day"]').sortable( connectWith: ".day" placeholder: "ui-state-highlight" update: (event, ui) -> neworder = new Array() $(this).children().each -> column = $(this).parent().attr("id").match(/\d+/)[0] id = $(this).attr("id").match(/\d+/)[0] neworder.push( id: id column: column ) alert neworder $.ajax url: "sort" type: "POST" data: { Activity: JSON.stringify(neworder) } ).disableSelection()
Как я разбираю вызов AJAX обратно к контроллеру Rails: Я зацикливаюсь через каждый объект
{"id":"1", "column":"1"}
в массиве, а также получая его позицию индекса.def sort JSON.parse(params[:Activity]).each_with_index do |x, index| idx = x["id"] positionx = index+1 column = x["column"] activity = Activity.find(idx) activity.update_attributes(:position => positionx, :day_id => column) end render nothing: true end
Возвращаясь к моей модели, я упорядочиваю ассоциацию "Activities" по ее положению, поэтому, когда я перечисляю ее в представлении, она отображается в правильном положении.
class Day < ActiveRecord::Base has_many :activities, :order => 'position' accepts_nested_attributes_for :activities, allow_destroy: true end
Более подробно о том, как я пришел к этому в этих 2 ответах:
Параметры форматирования для Ajax POST запроса к контроллеру Rails-для jQuery-UI сортируемый список