devise と cancan を使って権限管理可能な管理画面を作る。 (2)
はじめに
前回から少し間が開いてしまったが、今回は前回作った管理画面にcancanを使って権限機能 を追加する。
cancan とは
cancanは今述べた用に、権限管理を行うgemです。 devise の仕様を前提に作られているので deviseとの親和性が高いですが、少し違う方法をとるとはまります。(自分だけかもしれませんが)
環境構築
前回 gem は既にしてあると思いますが、
gem 'cancan'
bundle install --path vendor/bundler
これでインストールできると思います。 インストールできたら(ドキュメント)https://github.com/ryanb/cancanを参考にcancan用の設定ファイルを作成します。
bundle exec rails g cancan:ability
class Ability include CanCan::Ability def initialize(user) end end
サンプル
サンプルとして、 hoge@example.com のアドレスのユーザーだけが 見れるようにしてみます。
class Ability include CanCan::Ability def initialize(user) if user.email == "hoge@example.com" can :read, :all end end end
同様に viewを
<% if can? :read %> <p>can read</p> <% end %>
これで閲覧権限があるユーザーだけ can read と表示されるようになるはずです。
すいません。嘘です。 おそらく no method error … current_user のエラーで表示されないと思います。
僕はこれでハマりました。 これは cancan が User Model に権限を設定することを前提にしているためです。 今回作成した AdminUser Model では current_user ではなく current_admin_user というhelper_method が追加されています。
ですので、cancan用に書き換える必要があります。 (公式ドキュメント)https://github.com/ryanb/cancan/wiki/Changing-Defaultsを見るとcurrent_ability という メソッドをcancanし利用するControllerに追加してあげればよいので、 admin/base_controller に
def current_ability @current_ability ||= Ability.new(current_admin_user) end
を追加しましょう。 すると問題なく見れると思います。
以上 devise と cancan の使い方でした。