CanCanで、そのリソースへのアクセス権限チェックを行う関数として、load_and_authorize_resourceがあります。
これを使うと、アクセス権限をチェックした上で、違反した場合は例外送りにしてくれます。
class HogeController < ApplicationController load_and_authorize_resource def index ...(略) end def show ...(略) end def new ...(略) end def edit ...(略) end ...(略) end
しかも、このload_and_authorize_resourceはすごい機能があって、文字通りなんですが、リソースをロードしてくれます。つまり、scaffoldで定義していたような処理を勝手にやってくれます。index, show, new, editみたいなメソッドはcancanに任せて、削除できます。
class HogeController < ApplicationController load_and_authorize_resource ...(略) # こんなに短くなる! end
しかし、kaminariを使っている場合など、イレギュラーなものには対応してないっぽくて、indexメソッドを定義する必要があります。
class HogeController < ApplicationController load_and_authorize_resource def index params[:page] ||= 1 @hoge = Hoge.page(params[:page]) respond_to do |format| format.html # index.html.erb format.json { render json: @hoge } end end ...(略) # まぁこんなところです。 end
また、一部のメソッドでは認証したくないという場合、skip_load_and_authorize_resourceメソッドが使えます。これだけ定義すると、全部スキップしようとするので、:onlyでメソッドを指定します。
class HogeController < ApplicationController load_and_authorize_resource skip_load_and_authorize_resource :only => :search_hoge ...(略) end
ハマりがちなんですが、CanCanの権限チェックだけに注視していると、Deviseの認証チェックにひっかかってたりする場合があるので、skipなんちゃらをするときは、Deviseのほうもskipする必要があるでしょう。
class HogeController < ApplicationController skip_authorization_check :only => :search_hoge load_and_authorize_resource skip_load_and_authorize_resource :only => :search_hoge ...(略) end
こんな感じですかねぇ。