コレグレーデギネード

WindowsとかUbuntuとかRubyとかRailsとか

Rails5で動く acts_as_listの突っ込み方のメモ

注意)本番環境のrailsバージョンが3.2.12なのでそれに合わせて書いています。
最新バージョンの方は他へ行ってください。

Gamfileに、acts_as_listの記述を追加

gem 'acts_as_list'

acts_as_listのインストール

$ bundle install

カラムpositionをintegerで該当のテーブル(今回はUsers)に追加するためのマイグレーションファイルを作成する
$ bundle exec rails generate migration Addカラム名Toテーブル名 カラム名:データ型

$ bundle exec rails generate migration AddPositionToUsers position:integer

データベースに反映

$ rake db:migrate

Userモデルのattr_accessibleにpositionを追加してacts_as_list使いますよと書く
app/models/user.rb

class User < ActiveRecord::Base
  attr_accessible :name, :position #←これ
  has_many :calendars
  acts_as_list #←これ
end

Usersコントローラの改造
app/controllers/users_controller.rb

class UsersController < ApplicationController
  # GET /users
  # GET /users.json
  def index
#    @users = User.all #もともとの記述
#    @users = User.find(:all, :order => :position) # positionで並び替える RAILS VEROIN 4.*
    @users = User.all.order(:position) # RAILS VEROIN 5.*
    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @users }
    end
  end

# ここから追記
  def move_higher
    User.find(params[:id]).move_higher
    redirect_to users_url
  end

  def move_lower
    User.find(params[:id]).move_lower
    redirect_to users_url
  end

アクションを追加したのでroutesに追記
config/routes.rb

#  resources :users
  resources :users do
    get :move_higher, :on => :member
    get :move_lower, :on => :member
  end

ビューの改造
app/views/users/index.html.erb

<h1>Users List</h1>
<table>
  <tr>
    <th colspan="2">Positoin</th>
    <th>Name</th>
  </tr>
<% @users.each do |user| %>
  <tr>
    <td>
      <%= user.first? ? ' '.html_safe : link_to("▲", :action => :move_higher, :id => user) %>
      <%= user.last? ? ' '.html_safe : link_to("▼", :action => :move_lower, :id => user) %>
    </td>
    <td><%= user.position %></td>
    <td><%= user.name %></td>

    <td><%= link_to 'Show', user %></td>
    <td><%= link_to 'Edit', edit_user_path(user) %></td>
    <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
<% end %>

以上。
すでに運用している状態ならば追加したpositionカラムが空になってしまうので並び順もクソもない。
現在の並び順を初期値とするならばUser.idを引っこ抜いてUser.positionに突っ込むようなことをしてもいいのかも。

参考:
oe526.hatenablog.com
linuxserver.jp