acts_as_listとは
indexページなどで一覧表示しているデータの並び替えを簡単の実装できるgemのことです。このgemを利用することで各データごとに ”↑”、”↓” などのリンクを表示させクリックすることでそれぞれの並びを一つ上、一つ下と変更することが簡単になります。
acts_as_list使い方
・Gemfileに以下を追加し、bundle install
gem 'acts_as_list'
・”position”カラムの追加
acts_as_listで並び替えをする際の基準となるカラムは、”id”ではなく”position”というカラムです。これはもちろん元々モデルにあるものではないため、もしモデルを作成済みであれば新くmigrationファイルを作り、カラムを追加する必要があります。
・migrationファイルの作成
Taskモデルにカラムを追加したい場合以下のmigrationファイルを作成します。
class AddColumnPositionToTasks < ActiveRecord::Migration[5.2]
def change
add_column :tasks, :position, :integer
end
end
こちらのファイルを作成した後 rails db:migrate 。
(もし既存のデータがある場合、positionカラムにデータを入れておかなくてはいけません。自分の場合はrailsコンソールで各データのidを初期のpositionの値としました。)
・modelファイルにacts_as_listを利用するためのコードを追加する
カラムを用意しただけではgemの機能を使えるようにはなりません。並び替えの機能をモデルに追加するために、modelファイル内に”acts_as_list”というコードを追加してください。これで並び替えの機能を利用できるようになります。
class Task < ApplicationRecord
acts_as_list #この一行を追加
end
・viewページに並び替えのリンクを追加する
一覧表示されているデータに並び順を変更するアクションへのリンクを書きます。
%h1 データ一覧
%table
- tasks.each do |task|
%tr
%td= task.title
%td= task.body
%td= link_to "↑", move_higher_task_path(task) # 並び順をひとつ上へ
%td= link_to "↓", move_lower_task_path(task) # 並び順をひとつ下へ
・ルーティングの追加
viewに追加したリンクを並び替えのアクションに紐付けるためのルーティングを記述します。
resources :tasks do
member do
get :move_higher
get :move_lower
end
end
・actionの追加
最後に、並び変えの機能を利用できるようになったのでcontroller内で実際の並び替えをするコードを書いていきます。
def index
@tasks = Task.all.order(:position) # Task.allだけだとIDの順番でデータが表示されてしまうため"position"カラムを基準に並べ替えをする必要がある
end
def move_higher
Task.find(params[:id]).move_higher # viewで選択したtaskを一つ上の並び順に変更する
redirect_to tasks_path
end
def move_lower
Task.find(params[:id]).move_lower # viewで選択したtaskを一つ下の並び順に変更する
redirect_to tasks_path
end
これだけでデータを一覧表示する際の並び順を簡単に変更することができます。
タスク管理など優先順位の入れ替えなどをしたいときに便利なgem “acts_as_list”の使い方でした。