Как сделать перетаскиваемые колонки в таблице в представлении Rails

Я заполняю таблицу в представлении через each do через бд. Мне сейчас необходимо иметь возможность менять порядок колонок в таблице перетаскиванием. + ко всему сохранять этот результат. Можно, например, менять id у перетаскиваемой записи, а у остальных на единицу. Ну или иным методом, который позволит как-либо сохранять результат.

Я уже находил один способ менять порядок колонок, но он работает только с самостоятельно заданной таблицей.

А в более сложных методах у меня пока не получилось разобраться т.к., я ещё слишком новичок в rails.

Моё представление

<form method="GET">
  <select name="filter_option" onchange="this.form.submit()">
    <option value="">
      Выберите пользователя
    </option>
    <option value="0">
      Все
    </option>
    <% @users.each do |user| %>
      <option value="<%=user.id%>"><%= user.name %>
      </option>
    <% end %>
  </select>
</form>

<table>
  <thead>
    <tr>
      <th>Номер</th>
      <th>Проект</th>
      <th>Трекер</th>
      <th>Статус</th>
      <th>Тема</th>
    </tr>
  </thead>
<% @issues.each do |issues| %>
  <tbody>
      <tr>
        <td><%= issues.id %></td>
        <% @project = @projects.find_by(id: issues.project_id) %>
        <td><%= @project.name %></td>
        <% @tracker = @trackers.find_by(id: issues.tracker_id) %>
        <td><%= @tracker.name %></td>
        <% @status = @statuses.find_by(id: issues.status_id) %>
        <td><%= @status.name %></td>
        <td><%= issues.subject %></td>
      </tr>
  </tbody>
<% end %>
</table>

Мой контроллер

class TasksController < ApplicationController

  def index
    @issues = Issue.all
    @projects = Project.all
    if params[:filter_option]
      if params[:filter_option] != "0"
        @issues = Issue.where(assigned_to_id: params[:filter_option])
      else
        @issues = Issue.all
      end
    end
    @trackers = Tracker.all
    @statuses = IssueStatus.all
    @users = User.all
  end

end

Ответы (1 шт):

Автор решения: midnightelf18

недавно была подобная задача где надо было менять порядок строк в столбце и потом их сохранять. я не знаю ruby поэтому подсказать с бека не могу, но задачу можно решить с стороны фронта используя такой способ. упорядочить массив как надо на фронте и отправить этот массив с нужным порядком на бек. надеюсь поможет вам в решении вашей задачи
P.S. использовал таблицу другого вида и содержания чтобы подходило под placeholderapi чтобы показать как загружать данные в таблицу запросом

var table = new Tabulator("#example-table", {
  height: "512px",
  movableRows: true,
  data: [],
  columns: [{
      rowHandle: true,
      formatter: "handle",
      frozen: true,
    },
    {
      title: "userId",
      field: "userId",
    },
    {
      title: "Id",
      field: "id",
      sorter: "number"
    },
    {
      title: "Title",
      field: "title"
    },
    {
      title: "completed",
      field: "completed",
      formatter: "tickCross"
    }
  ],
});

// загрузка данных в таблицу. данные получаем из api
table.on('tableBuilt', function() {
  table.setData('https://jsonplaceholder.typicode.com/todos')
});

// при нажатии на кнопку выводим массив с данными
document.getElementById("get-example-table").addEventListener("click", function() {
  console.log(table.getData());
});

// при нажатии на кнопку отправляем массив с данными в таком порядке в каком установили их в таблицу
document.getElementById("save-example-table").addEventListener("click", async function() {
  const data = {
    method: 'POST',
    headers: {
      ContentType: 'application/json'
    },
    data: JSON.stringify(table.getData()),
  }
  console.log(data.data)
  const res = await fetch('https://jsonplaceholder.typicode.com/todos', data)
});

// пример как загрузить данные в таблицу в зависимости от выбора select
document.getElementById("select-user").addEventListener("change", function(event) {
  table.setData(`https://jsonplaceholder.typicode.com/todos?id=${event.target.value}`);
})
<script src="https://unpkg.com/tabulator-tables/dist/js/tabulator.min.js"></script>
<link href="https://unpkg.com/tabulator-tables/dist/css/tabulator.min.css" rel="stylesheet" />


<button type="button" id="save-example-table">сохранить</button>
<button type="button" id="get-example-table">показать в консоли массив</button>

<form>
  <select id="select-user">
    <option disabled selected>All</option>
    <option value="1">User 1</option>
    <option value="2">User 2</option>
    <option value="3">User 3</option>
  </select>
</form>

<div id="example-table"></div>

→ Ссылка