Хорошо, я сделал еще кое-какие поиски и выяснил, что, похоже, в основном работает.
edit.html.erb:
...
<table id="invoices">
<thead>
<tr>
<th>Id</th>
<th>Description</th>
</tr>
</thead>
<tbody id="line_items">
<%= render :partial => 'invoice_line_item', :collection => @invoice.invoice_line_items.sort %>
</tbody>
</table>
<%= sortable_element('line_items', {:url => {:action => :update_index}, :tag => :tr, :constraint => :vertical}) -%>
...
приложение / контроллеры / invoices.rb
...
def update_index
params["line_items"].each_with_index do |id, index|
InvoiceLineItem.update(id, :index => index)
end
render :nothing => true
end
...
Важная часть: tag =>: tr в "sortable_element" и params ["line_items"] - это дает новый список идентификаторов и запускается по капле.
Ущерб: делает вызов AJAX по капле, думаю, я бы предпочел сохранить заказ и обновлять его, когда пользователь нажимает «сохранить». Не проверено в IE.