表示順の入れ替え(2)

2015/10/23

前回からタスクの表示順を入れ替える機能を作り始めました。現状は上下移動のボタンを設置したところです。今回はサーバー側 API を作ります。


まず、リストの順序入れ替え処理を容易にしてくれる Gem パッケージ actsaslist を導入しましょう。

Gemfile

gem 'acts_as_list'

ターミナルで次のコマンドを実行します。

bin/bundle

acts_as_listREADME.md に従って、さらに以下のコマンドを順に実行します。

bin/rails g migration AddPositionToTasks position:integer
bin/rake db:migrate
bin/rake db:reset

Task クラスに acts_as_list を組み込みます。app/models/task.rb を次のように書き換えてください。

class Task < ActiveRecord::Base
  acts_as_list
end

続いて、API を作ります。現在、config/routes.rb は次のようになっています。

Rails.application.routes.draw do
  root 'top#index'

  namespace :api do
    resources :tasks, only: [ :index, :create, :update, :destroy ]
  end
end

これを次のように変更します。

Rails.application.routes.draw do
  root 'top#index'

  namespace :api do
    resources :tasks, only: [ :index, :create, :update, :destroy ] do
      patch :move_higher, :move_lower, on: :member
    end
  end
end

acts_as_list では「上に移動する」を move_higher、「下に移動する」を move_lower と表現します。私たちの API にもそれに合わせた名前を付けました。

次に、move_higher アクションと move_lower アクションを実装します。app/controllers/tasks_controller.rb を次のように書き換えてください。

class Api::TasksController < ApplicationController
  def index
    @tasks = Task.order(position: :asc)
  end

  (省略)

  def destroy
    Task.find(params[:id]).destroy
    render text: 'OK'
  end

  def move_higher
    task = Task.find(params[:id])
    task.move_higher
    render text: 'OK'
  end

  def move_lower
    task = Task.find(params[:id])
    task.move_lower
    render text: 'OK'
  end

  private
  (省略)

acts_as_list のおかげで、とてもシンプルなコードとなりました。これらのアクションは Ajax で用います。サーバーからブラウザへは単に「OK」という文字列を返しています。


以上で API の準備ができました。次回は、この API を利用して JavaScript 側を完成させます。