読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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 %>

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