RailsとDeviseで管理者ユーザーを作ることに成功した

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

users テーブルに admin 列を作る

まずは管理者マークをつけるために users テーブルに admin 列を作る。この列が true のユーザーが管理者(admin)てわけ。いろいろググってみると専用のテーブルを作っている例もあるけど、ここはお手軽な方法でいくことにした。

takatoh@nightschool $ rails generate migration add_admin_to_useres admin:boolean

できたマイグレーションファイルを編集。null: falsedefault: 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 

これで終了。

確認

1st-user-sign-up

初めてのユーザーがサインアップしようとしているところ。Admin のチェックボックスが表示されている。ここをチェックしてサインアップすれば管理者になる。

2nd-user-sign-up

で、これが2人目のユーザーがサインアップしようとしているところ。Adminのチェックボックスは表示されていない。

参考にしたページ

 cf. 【Rails4】deviseとactive_adminで一般ユーザーと管理者ユーザーを作成 – avosalmonのブログ
 cf. Rails の認証プラグイン Devise での Strong Parameters について – EasyRamble
 cf. DeviseでViewをカスタマイズする – Qiita

Ubuntuの端末のプロンプトをカスタマイズ

デフォルトでは「ユーザー名@ホスト名:カレントディレクトリ$」となってるんだけど、長いので短くしたい。特にディレクトリの深いところまで行くと1行じゃ納まらなくなったりしてすごく邪魔。
というわけで、↓このページを参考に変更してみた。

 cf. Ubuntu 端末のコマンドプロンプトをカスタマイズしてユーザー名やコンピューター名を非表示にする – Ubuntuアプリのいいところ

リンク先のページでは、ユーザー名とホスト名を消してるけど、上にも書いたとおりディレクトリを消したほうがシンプルになる。
具体的には、.bashrc を PS1 変数を設定している部分(俺の環境では60行目付近)を編集する。

takatoh@nightschool:~$ subl .bashrc
else
    # PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    PS1='${debian_chroot:+($debian_chroot)}\u@\h \$ '
fi

コメントアウトしてあるのが元の行。\w がカレントディレクトリを指しているみたいだ。
で、これを適用するとこうなった。

takatoh@nightschool:~$ source .bashrc
takatoh@nightschool $