jQuery-UI Sortable Connected-Lists保存订单并与rails模型关联

时间:2012-11-02 23:55:56

标签: jquery ruby-on-rails ruby jquery-ui jquery-ui-sortable

让我说我有: 带有许多“问题”的“调查”,其中包含许多“答案”

如果我有一个'调查'有两个'问题'实例,那就叫他们:'好问题'和'错误问题'

'好问题'有5'答案','不良问题'有3'答案'

如果'好问题'和'错误问题'与这个jQuery-UI交互连接可排序列表。 http://jqueryui.com/sortable/#connect-lists

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

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

我非常感谢这里的帮助!

修改

我意识到我只需要向Rails控制器发送POST,这是我将'Answer'放入(即<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。 Get the item/object where the element is dropped

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

1 个答案:

答案 0 :(得分: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

有关我如何通过以下两个答案达到此目的的详细信息:

Formatting Parameters for Ajax POST request to Rails Controller - for jQuery-UI sortable list

jQuery AJAX POST to Rails Controller. Error when doing each_with_index (TypeError can't convert Symbol into Integer)