Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

gem 'cancan'で楽に管理者権限機能を実装する

gem 'device'でログイン機能を追加したはいいものの、
デフォルトだと誰でもユーザ登録が出来て何かと不便な事があります。
クローズドβとか)

そんなときに役に立つのが、gem 'cancan'です。
今回のケースでは、既にdeviceが稼働しているシステムに権限を追加する方向で作業します。

まずは、Gemfileに

gem 'cancan'

を追加し、

$ bundle install
$ rails g migration add_role_to_users role:string
$ rake db:migrate:reset
$ rake db:reset
$ rails g cancan:ability

で導入準備完了です。

二行目のコマンドで、既存のUserモデルにroleが追加されました。
app/models/users.rbに対応するロジックを記述します。

class User < ActiveRecord::Base
  ##中略
  attr_accessible :role
  ROLES=%w[admin user]
  ##後略  
end

続いて、既存データベースの更新ですが……
すみません。今回のシステムではuserをseed.rbで作っているのでそちらの修正コードを添付します。
誰か詳しい方動いてるsqlに一括してデータ登録する方法を教えて下さい(

...まぁ、気を取り直して
#{Rails.root}/db/seeds.rbを

table_names = ["users","measure"]

table_names.each do |table_name|
  path = "#{Rails.root}/db/seeds/#{Rails.env}/#{table_name}.rb"
  require(path) if File.exist?(path)
end

のように設定している場合、
#{Rails.root}/db/seeds/development/users.rbを以下のように編集します。

##ユーザ情報配列
name       = %w[alpha beta]
device_id = %w[001 002]
passeord = %w[alpha001 beta002]

##まずは通常ユーザの生成
number.times do |i|
  user = User.create(
    :name => name.shift,
    :device_id => device_id.shift,
    :password => password[i],
    :password_confirmation => password[i],
    :role => "user"
)

##続いて、管理ユーザの生成。
##実際のパスワード等々は別ファイルで記述する事を強く勧めます。
  User.create(
    :name => "admin",
    :device_id => "000",
    :password => "pass000",
    :password_confirmation => "pass000",
    :role => "admin"
  )

続いて、app/models/ability.rbに以下を追加

class Ability
  include CanCan::Ability

  ##中略
  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.role == "admin"
      can :manage, :all
    else
      can :read, :all
    end
  end
  ##後略 
end

あとは、ログイン後、view/home/main.html.erbのようなファイルに

<% if can? :manage, @user %>
<p><%= link_to 'ユーザー登録', [ :new, :user_registration ]  %></p>
<% end %>

といった記述を追加してあげれば、特定ユーザのみがデータ登録をできる仕組みが作れます。