javascriptruby-on-railsjquery-uiacts-as-list

Rails jQuery sortable unable to save


I'm trying to make my table sortable (drag and drop) using jQuery, the problem I'm having is saving the new sorted table and then publishing it to other users or when the browser is refreshed.

I'm using:

gem 'acts_as_list' Rails 3.2.17 ruby 1.9.3p484

Is there a better way of doing this?

my sort and show method on my controller

def sort @episodes = current_user.episodes_for(@show).each do |episode| episode.position = params['episode'].index(episode.id.to_s) + 1 episode.save end render :nothing =>true end

  def show
    @episodes = current_user.episodes_for(@show)
    @episodes.order('episode.position ASC')
    @episode = @episodes.where(id: params[:id]).first
  end

My Javascript

<script>
$(window).load(function() {
    $("#sortthis").sortable({
      axis: 'y',
      placeholder: 'ui-state-highlight',
      cursor: 'move',
      dropOnempty: false,
      scroll: true,
      opacity: 0.4,

      update: function(event, ui){
        var itm_arr = $("#sortthis").sortable('toArray');
        var pobj = {episodes: itm_arr};
        $.post("/episodes/sort", pobj);
      }

    });
});
 </script>

The table I wanna sort in views:

<tbody id='eps'>
<tr>
  <th>Title</th>
  <th>#</th>
  <th>Season</th>
  <th>Download?</th>
  <th>Shared?</th>
  <th>Length</th>
  <th>Status</th>
        <th></th>
</tr>
<% for episode in @episodes %>
  <tr>
    <td id="eps_<%= episode.id %>", width="20%"><%=h episode.title %></td>
    <td id="eps_<%= episode.id %>"><%=h episode.number %></td>
    <td id="eps_<%= episode.id %>"><%=h episode.season %></td>
    <td id="eps_<%= episode.id %>"><%=h episode.is_downloadable %></td>
    <td id="eps_<%= episode.id %>"><%=h episode.shared_with_dev %></td>
    <td id="eps_<%= episode.id %>"><%=h episode.length %></td>
    <td>
      <% if episode.video %>
        <%= link_to 'Replace Video', new_show_episode_video_path(episode.show, episode) %>
      <% else %>
        <%= link_to 'Upload Video', new_show_episode_video_path(episode.show, episode) %>
      <% end %>
    </td>
        <td>
        <%= link_to "View", [episode.show, episode] %> &nbsp;
    <%= link_to "Edit", edit_show_episode_path(episode.show, episode) if permitted_to? :update, episode %> &nbsp;
    <%= link_to "Delete", show_episode_path(episode.show, episode), :confirm => 'Are you sure?', :method => :delete if permitted_to? :delete, episode %>
    </td>
  </tr>
<% end %>

any help will be greatly appreciated!


Solution

  • I figured it out, made the following changes:

    Views:

    <tr id="<%= episode.id %>">
    

    and new controller

    def sort
      Episode.all.each do |e|
        if position = params[:episodes].index(e.id.to_s)
          e.update_attribute(:position, position + 1) unless e.position == position + 1
        end
      end
      render :nothing => true, :status => 200
    end
    

    finally added this to my model:

      acts_as_list
      default_scope order('position')
    

    let me know if anyone's having similar issues.