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
こんな感じですかねぇ。
