Rails 5.2: перетаскивание с помощью Acts_as_List без сохранения обновленной позиции в базе данных - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь добавить функцию сортировки с помощью перетаскивания в приложение списка дел, используя этот эпизод GoRails .

Использование gem 'acts_as_list' и gem 'jquery-ui-rails' У меня так, что элементы можно перетаскивать, поэтому с точки зрения пользователя все работает нормально.

Проблема в том, чтоновая позиция не сохраняется в базе данных, поэтому после нажатия кнопки «Обновить» ордер возвращается к своей предыдущей позиции.

Единственный сложный момент в моем приложении - это то, что это происходит для нескольких различных элементов div нана одной странице (есть отдельные списки для одноразовых, ежедневных, еженедельных и ежемесячных заданий).У меня есть базовая структура, подобная этой, для моей index страницы показа (где все это происходит):

  <div class="container">
        <div class="row">
            <div class="col-xs-12 col-md-6 col-lg-12">
            <div class="content-box to-do">
              <h2 class="font-script color-neutral text-center">One-Time Tasks</h2>
        <p class="text-center color-neutral">These tasks are here to stay, until you complete them.</p>
                    <div id="onetime-todo"><%= render partial: 'items', locals: { task: @one_time } %></div>
                    <div id="onetime-done"><%= render partial: 'done', locals: { task: @one_time_done } %></div>
            </div> <!-- content box -->
            </div> <!-- col -->

            <div class="col-xs-12 col-md-6 col-lg-4">
            <div class="content-box to-do">
              <h2 class="font-script color-neutral text-center">Daily</h2>
                    <p class="text-center color-neutral">These automatically uncheck at night so you have a fresh list&nbsp;in&nbsp;the&nbsp;morning.</p>
              <div id="daily-todo"><%= render partial: 'items', locals: { task: @daily } %></div>
                    <div id="daily-done"><%= render partial: 'done', locals: { task: @daily_done } %></div>
            </div> <!-- content box -->
            </div> <!-- col -->

            <div class="col-xs-12 col-md-6 col-lg-4">
            <div class="content-box to-do">
              <h2 class="font-script color-neutral text-center">Weekly</h2>
                    <p class="text-center color-neutral">These automatically uncheck Sunday night so you get a new list&nbsp;each&nbsp;Monday&nbsp;morning.</p>
              <div id="weekly-todo"><%= render partial: 'items', locals: { task: @weekly } %></div>
                    <div id="weekly-done"><%= render partial: 'done', locals: { task: @weekly_done } %></div>
            </div> <!-- content box -->
            </div> <!-- col -->

            <div class="col-xs-12  col-md-6 col-lg-4">
            <div class="content-box to-do">
              <h2 class="font-script color-neutral text-center">Monthly</h2>
                    <p class="text-center color-neutral">These automatically uncheck on the last day of the month so you start with a clean&nbsp;list&nbsp;each&nbsp;1st.</p>
              <div id="monthly-todo"><%= render partial: 'items', locals: { task: @monthly } %></div>
                    <div id="monthly-done"><%= render partial: 'done', locals: { task: @monthly_done } %></div>
            </div> <!-- content box -->
            </div> <!-- col -->
        </div> <!-- row -->
  </div> <!-- container -->

А затем магия перетаскивания происходит в частичном _items.html.erb:

<div class="to-do-list taskWrapper" data-url="<%= sort_tasks_path %>">
  <% task.each do |task| %>
    <%= link_to task, id: dom_id(task) do %>
      <p>
        <%= fa_icon "bars", class: "color-neutral-light", style: "margin-right: 5px;" %>
        <%= link_to check_task_path(task), method: :post, remote: true do %>
          <%= fa_icon "square-o", style: "margin-right: 5px;" %>
        <% end %>
        <span id="task-show-hide">
          <span class="font-serif">
            <%= task.name %>
          </span>
          <span>
            <%= link_to task_path(task), method: :delete, remote: true do %>
              <%= fa_icon "remove", id: (task.id.to_s + "task"), style: "margin-left: 5px" %>
            <% end %>
          </span>
        </span>
      </p>
    <% end %> <!-- dom id wrapper -->
  <% end %> <!-- task each -->
</div>

<script>
    $(document).ready(function() {
        $('.content-box').matchHeight();
    $('.taskWrapper').sortable({
      update: function(e, ui) {
        Rails.ajax({
          url: $(this).data("url"),
          type: "PATCH",
          data: $(this).sortable('serialize'),
        });
      }
    });
    });
</script>

Мои подходящие tasks_controller методы:

  def set_variables
    @user_tasks = Task.where(user_id: current_user.id)
    @one_time = Task.where(frequency: "OneTime", completed: false, user_id: current_user.id).order(:position)
    @one_time_done = Task.where(frequency: "OneTime", completed: true, user_id: current_user.id).order(:position)
    @daily = Task.where(frequency: "Daily", completed: false, user_id: current_user.id).order(:position)
    @daily_done = Task.where(frequency: "Daily", completed: true, user_id: current_user.id).order(:position)
    @weekly = Task.where(frequency: "Weekly", completed: false, user_id: current_user.id).order(:position)
    @weekly_done = Task.where(frequency: "Weekly", completed: true, user_id: current_user.id).order(:position)
    @monthly = Task.where(frequency: "Monthly", completed: false, user_id: current_user.id).order(:position)
    @monthly_done = Task.where(frequency: "Monthly", completed: true, user_id: current_user.id).order(:position)
  end

  def sort
    params[:task].each_with_index do |id, index|
      Task.where(id: id).update_all(position: index + 1)
    end

head :ok

end

И наконец, мой журнал сервера показывает это:

Started PATCH "/tasks/sort" for 127.0.0.1 at 2018-10-20 11:16:06 -0700
Processing by TasksController#sort as */*
  Parameters: {"task"=>["2", "8"]}
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /Users/lizbayardelle/.rvm/gems/ruby-2.5.0/gems/activerecord-5.2.1/lib/active_record/log_subscriber.rb:98
  Task Update All (0.2ms)  UPDATE "tasks" SET "position" = 1 WHERE "tasks"."id" = ?  [["id", 2]]
  ↳ app/controllers/tasks_controller.rb:27
  Task Update All (0.1ms)  UPDATE "tasks" SET "position" = 2 WHERE "tasks"."id" = ?  [["id", 8]]
  ↳ app/controllers/tasks_controller.rb:27
Completed 200 OK in 3ms (ActiveRecord: 0.5ms)

Пока чтоэто не дает мне никаких ошибок (консоль или рельсы) в localhost, но на Heroku выдает FATAL -- : [cd6ed1ad-4095-4eb2-9f28-201ec2e74c19] 1: <div class="to-do-list taskWrapper" data-url="<%= sort_tasks_path %>">

Может кто-нибудь помочь мне получить это без ошибок и сохранение в базе данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...