2

假设我有:一个包含许多“问题”的“调查”,其中包含许多“答案”

如果我的“调查”中有 2 个“问题”实例,我们称它们为:“好问题”和“坏问题”

“好问题”有 5 个“答案”,“坏问题”有 3 个“答案”

如果“好问题”和“坏问题”是通过 jQuery-UI 交互连接的可排序列表。http://jqueryui.com/sortable/#connect-lists

我知道如何使用 jQuery-UI 将它们显示为 2 个可排序的列表,并且我还可以将“答案”从“坏问题”放到“好问题”中。但是我如何将他们新排序的位置和他们新排序的关联保存到另一个“问题”回到 Rails 数据库?

Railscasts 有如何为单个可排序列表保存位置,但不为属于不同关联模型的列表保存位置。 http://railscasts.com/episodes/147-sortable-lists-revised

我真的很感谢这里的帮助!

编辑

我意识到我只需要发布到 Rails 控制器,我将“答案”放入(即<ol class = "connectableSortable" id = "Good_Question"</ol>)的列表的元素 id

这是 Railscast 如何向 Rails 控制器发送 POST 以按可排序顺序传递 object_id 数组的语法。

jQuery ->
  $('#faqs').sortable(
    axis: 'y'
    update: ->
      $.post($(this).data('update-url'), $(this).sortable('serialize'))
  )

我将如何更新此 POST 以将列表 ID 传递给它,这样我就可以将“答案”的“问题”外键更新为它所属的列表“ID”?

这个 SO 答案有一种方法来检索列表 ID。获取元素被删除的项目/对象

所以现在,我真的只需要知道如何将一个额外的参数传回 Rails 控制器。有什么帮助吗?

4

1 回答 1

3

经过几天的努力,我能够弄清楚我想要什么。这里的模型是一天有很多活动(而不是原来的问题有很多答案)。

这是我的 jQuery 代码(在 Coffeescript 中):使用 jQuery 选择器获取每个列表项的 ID 和每个列表项的列 ID。将其作为看起来像这样的参数推送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

回到我的模型中,我通过它的位置订购“活动”关联,所以当我在视图中列出它时,它会显示在正确的位置。

class Day < ActiveRecord::Base
  has_many :activities, :order => 'position'
  accepts_nested_attributes_for :activities, allow_destroy: true 
end

在这 2 个答案中,有关我如何做到这一点的更多详细信息:

对 Rails 控制器的 Ajax POST 请求的格式化参数 - 用于 jQuery-UI 可排序列表

jQuery AJAX POST 到 Rails 控制器。执行 each_with_index 时出错(TypeError 无法将 Symbol 转换为 Integer)

于 2012-11-05T16:52:51.567 回答