昼過ぎから半日いろいろとやって、やっと成功したので忘れないうちに手順をメモ。
users テーブルに admin 列を作る
まずは管理者マークをつけるために users テーブルに admin 列を作る。この列が true のユーザーが管理者(admin)てわけ。いろいろググってみると専用のテーブルを作っている例もあるけど、ここはお手軽な方法でいくことにした。
takatoh@nightschool $ rails generate migration add_admin_to_useres admin:boolean
できたマイグレーションファイルを編集。null: false と default: false を追記。
class AddAdminToUsers < ActiveRecord::Migration
def change
add_column :users, :admin, :boolean, null: false, default: false
end
end
でもってマイグレーション実行。
takatoh@nightschool $ rake db:migrate
config/initializers/devise.rbを編集
次の行がコメントアウトされているのをやめて、false を true に変更。
config.scoped_views = true
Deviseのviewをコピーして編集
takatoh@nightschool $ rails generate devise:views users
上のコマンドで Devise の標準の view がアプリの中にコピーされる。できたファイルのうち、サインアップに使う app/views/users/registrations/new.html.erb を編集して admin 用のチェックボックスを追加。
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div>
<%= f.label :email %>
<%= f.email_field :email, autofocus: true %>
</div>
<div>
<%= f.label :password %>
<%= f.password_field :password, autocomplete: "off" %>
</div>
<div>
<%= f.label :password_confirmation %>
<%= f.password_field :password_confirmation, autocomplete: "off" %>
</div>
<% if @noadmin %>
<div>
<%= f.label :admin %>
<%= f.check_box :admin, { }, true, false %>
</div>
<% end %>
<div>
<%= f.submit "Sign up" %>
</div>
<% end %>
<%= render "users/shared/links" %>
controllerの修正
最後は controller の修正。2つ修正がある。ひとつは app/controllers/application_controller.rb。
class ApplicationController < ActionController::Base
# Prevent CSRF attacks by raising an exception.
# For APIs, you may want to use :null_session instead.
protect_from_forgery with: :exception
before_filter :configure_permitted_parameters, if: :devise_controller?
private
def after_sign_in_path_for(resource)
"/dashboard/"
end
def check_signed_in
unless signed_in?
redirect_to '/'
end
end
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :admin
devise_parameter_sanitizer.for(:account_update) << :admin
end
end
もうひとつは app/controllers/users/regitrations_controller.rb。
class Users::RegistrationsController < Devise::RegistrationsController
def new
@user = User.new
@noadmin = User.where('admin = ?', true).empty?
end
end
これで終了。
確認
初めてのユーザーがサインアップしようとしているところ。Admin のチェックボックスが表示されている。ここをチェックしてサインアップすれば管理者になる。
で、これが2人目のユーザーがサインアップしようとしているところ。Adminのチェックボックスは表示されていない。
参考にしたページ
cf. 【Rails4】deviseとactive_adminで一般ユーザーと管理者ユーザーを作成 – avosalmonのブログ
cf. Rails の認証プラグイン Devise での Strong Parameters について – EasyRamble
cf. DeviseでViewをカスタマイズする – Qiita

