0

jQuery UI Sortable を使用して、Web サイトの行を並べ替えています。

これが私の見解です:

<section class="data-list">
    <article id="item_<%= item.id %>" class="data sortable">
        <!-- stuff goes here -->
    </article>
</section>

これが私のJSです:

$('.data-list').sortable({items: '> .data'}).bind('sortupdate', function() {
    var release = getUrlVars()["id"];
    $.ajax({
        type: 'POST',
        data: $(this).sortable("serialize"),
        url: '/release_items/'+ release +'/prioritize'
    });
});

これにより、params['item']次のような配列が作成されます。

["1537", "1536", "1540", "1541", "1542", "1543", "1544", "1545", "1547", "1546"]

これが私のコントローラーコードです:

def prioritize
    @release = Release.find(params[:id])
    item = @release.release_items
    item.each do |i|
        i.priority = params['item'].index(i.id.to_s).to_i + 1
        i.save
    end
end

私の問題は、列release_itemsによって区別されるものがいくつかあることです。item_typeそして、現状では、現在、コントローラーで item_type でフィルター処理する良い方法がありません@release = Release.find(params[:id])

私がやりたいことは、アイテムが配列item.each do |i|にある場合にのみ優先度が設定されることをループで確認することです。params['item']どうすればいいですか?これが十分に明確でない場合はお知らせください。ありがとう!

編集1:

リリースごとに、n個のリリース アイテムがあります。これらのリリース アイテムは、サイト上での表示用にitem_type列ごとに分けられています (例: 一般、プロジェクト、データ、パッチ)。そのため、サイトには 4 つの異なるアイテム リストがあり、それら 4 つのリストを個別に並べ替えられるようにしたいと考えています。上記のように、コントローラーparams['item']のアクションに渡される配列にはprioritize、並べ替える必要がある項目のみが含まれています。

私が実行している問題は、アクションの最初の 2 行が、配列prioritize内のものだけでなく、すべてのリリース アイテムを取得することです。params['item']配列内の値は、並べ替える必要があるリリース アイテムの ID です。すべてのリリース アイテムを取得する代わりに、params['item']配列内にあるアイテムのみを取得したい。選択できる ReleaseItem モデルもあります。だから、私はこれをやろうとしています:(わかりやすくするために、これは正しいコードではないことを知っています)

item = ReleaseItem.find(conditions: "id in params['item']")

それはもう少し理にかなっていますか?私はあなたの助けに感謝します!

4

1 に答える 1

1

私はあなたが何をしようとしているのか理解していると思います...

def prioritize
    @release = Release.find(params[:id])
    items = @release.release_items.where("id IN (?)", params['item'])
    items.each_with_index do |item, index|        
        item.priority = index + 1
        item.save
    end
end
于 2013-05-14T22:03:23.850 に答える