昼過ぎから半日いろいろとやって、やっと成功したので忘れないうちに手順をメモ。
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