2017-04-13 11 views
-1

私は並べ替え可能なリストについてRailscastに従っていました。しかし、2つの接続可能なソート可能なリストを作成しようとしたところ、シリアライズでは要素のIDのみを格納できることがわかりました。各リストの要素IDのためにリストのIDをシリアル化する方法はありますか?または、リストの要素親IDをマージして結果をシリアル化しますか?JQueryのソート可能なリストは、シリアル化するconnectWith?

この回答はjQuery-UI Sortable Connected-Lists save order and association to rails modelです。これは私がリスト間で要素をドラッグして正常にdbに保存することができましたが、1つのリストを持つ要素をソートすると適切に保存されませんでした。

ビュー

<% @project.tasks.group_by(&:column).each do |column, tasks| %> 
    <ul id='tasks_<%= column %>' data-update-url='<%= sort_project_tasks_url(@project) %>'> 
    <% tasks.sort_by! { |t| t.priority }.each do |task| %> 
     <li id="task_<%= task.id %>"> 
     <%= task.name %>| <%= column %> | <b><%= task.priority %></b> 
     </li> 
    <% end %> 
    </ul> 
<% end %> 

私が使用したスクリプトプレーンシリアル化の変種。

jQuery -> 
    $('#tasks_done').sortable 
    connectWith: '#tasks_dev' 
    update: -> 
     $.post($(this).data('update-url'), $(this).sortable('serialize')) 

スクリプト私はリンクされた質問から得ました。また、リスト間の要素をドラッグするために正常に動作しますが、リスト内のソートは、2番目のスクリプトバリアント

def sort 
    JSON.parse(params[:Activity]).each_with_index do |data, index| 
    id = data['id'] 
    priority = index + 1 
    column = data['column'] 
    column.slice! 'tasks_' # columns ids are tasks_<%= task.column %> 
    task = Task.find(id) 
    task.update_attributes(priority: priority, column: column) 
end 

のために更新、(今のところ強いのparamsなし)適切コントローラでアクションを対応

jQuery -> 
    $('#tasks_dev').sortable 
    connectWith: '#tasks_done' 
    update: (event, ui) -> 
     neworder = new Array() 
     $(this).children().each -> 
      column = $(this).parent().attr('id') 
      id = $(this).attr('id').match(/((?!task_).)*$/)[1] 
     neworder.push(
      id: id 
     column: column 
     ) 
    $.post($(this).data('update-url'), Activity: JSON.stringify(neworder)) 

保存されませんだから、主な問題は:リスト間で移動された要素を追跡しながら、ソート結果を1つのリストに保存する方法を理解することができません。サーバー側ではやりやすいようですが、フロントエンドには慣れていないので、クライアント上でparamsを適切に作成する方法を理解できません。

+1

"[ask]"と "[mcve]"とそのliをお読みくださいnkedページ。コードの問題について質問するときは、問題を複製する最小限のコードを確認する必要があります。それがなければ、あなたのコードを想像してみる必要はありません。あなたが記述できる以上のことを想像することができたらうまくいかないでしょう。 –

+0

申し訳ありません、更新された質問です。 –

答えて

0

ここで私が思いついた解決策があります。基本的には、リストのIDを取得し、結果をソート可能(「シリアライズ」)してポストします。

tasks.coffee(私は後で.erbでそれをリファクタリングします)

jQuery -> 
    $('#tasks_done').sortable 
    connectWith: '#tasks_dev' 
    update: -> 
     $.post($(this).data('update-url'), 'column' + '=' + $(this).attr('id') + '&' + $(this).sortable('serialize')) 

jQuery -> 
    $('#tasks_dev').sortable 
    connectWith: '#tasks_done' 
    update: -> 
     $.post($(this).data('update-url'), 'column' + '=' + $(this).attr('id') + '&' + $(this).sortable('serialize')) 

tasts_controller.rb

def sort 
    column = params[:column].delete! 'tasks_' 
    params[:task].each_with_index do |id, index| 
     Task.where(id: id).update_all(priority: index + 1, column: column) 
    end 
end 

結成のparams: http://imgur.com/a/tHNj9

(申し訳ありませんが、しないでください

関連する問題