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

@Konboi memo

主に技術に関してつらつらと。

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 の使い方でした。