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に突っ込むようなことをしてもいいのかも。