Rails3.0 で Devise と CanCan を動かす

目的

 認証と権限

環境

  • gem 1.3.7
  • Rails 3.0.5
  • Devise 1.1.8
  • CanCan 1.6.2

内容

Welcome(認証)->TOP(権限にて表示を変更)

Welcomeページの作成、deviseの設定は省略します。
lounge1975さんの日記を参考にいたしました。

Gemfile
gem 'devise'
gem 'cancan'
$ bundle install

Userモデルとビューの作成
$ r g devise:install
$ r g devise users
$ r g devise:views
$ r g migration add_role_to_users role:string
$ rake db:migrate
$ r g cancan:ability

app/models/users.rbに以下を追加
(省略)
attr_accessible :role
ROLES=%w[admin author]
(省略)

app/models/ability.rbに以下を追加
(省略)
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role == "admin"
can :manage, :all
else
can :read, :all
end
end
(省略)

app/views/devise/registrations/new.html.rbと
app/views/devise/registrations/edit.html.rbに以下を追加
に以下を追加
(省略)
<%= f.label :role %>
<%= f.collection_select :role, User::ROLES, :to_s, :humanize%>
(省略)

app/views/hoges/index.html.erbを編集(ここではadminだけにEditを表示させます)<% if can? :manage, hoge %><%= link_to 'Edit', edit_hoge_path(hoge) %><% end %>

実行すると、'Admin'でのユーザ登録者のみが
「Edit」できるようになります。
その他のユーザは「Edit」できません。

あと書き

Deviseで認証、cancanは権限です。cancanは権限を継承したり、代理も可能そうなので、おもしろそうだと感じました。