上記URI によれば、Cancan の Rails 4.1 対応があまり進んでいないらしい。
実際に Cancan の github を見てみると Issues と Pull Requests が溜まっています。
https://github.com/ryanb/cancan
そこで、http://blog.n-z.jp/blog/2013-10-08-rails4-authorization.html を参考に
pundit という gem を導入しました。
実際 pudit を使用して作成しましたが、gemを導入しなくていいくらいシンプルな考えで認可が管理できます。
Readme にも書かれていますが、
class ApplicationPolicy
attr_reader :user, :record
def initialize(user, post)
@user = user
@post = record
end
def index?
post_public?
end
def show?
user_signed_in?
end
end
こんな感じで、コントローラー毎に ?のついたメソッドを作成して、
そのコントローラーで
def index
@policy = PostPolicy.new(current_user, Post)
return render :file => "public/401.html", :layout => false, :status => :unauthorized unless @policy.index?
として、カレントユーザーの権限を判定します。(※ここではユーザー管理は devise を使っています)
また、コントローラー毎のメソッドだけでなく、
post_public?
user_signed_in?
等、ユーザーの状態を判定するメソッド(例: user_signed_in?)や、インスタンスの状態を判定するメソッド(例: post_public?)
も public メソッドとして追加してみましょう。
上記のコントローラーで @policy としているので、ビューで、権限判定が必要な部分は、全てこれを使います。
こうすると権限は、全て policyクラスに押し込めて便利です。