CanCanで、そのリソースへのアクセス権限チェックを行う関数として、load_and_authorize_resourceがあります。
これを使うと、アクセス権限をチェックした上で、違反した場合は例外送りにしてくれます。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 | 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に任せて、削除できます。
1 2 3 4 | class HogeController < ApplicationController load_and_authorize_resource ...(略) # こんなに短くなる! end |
しかし、kaminariを使っている場合など、イレギュラーなものには対応してないっぽくて、indexメソッドを定義する必要があります。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | 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でメソッドを指定します。
1 2 3 4 5 | class HogeController < ApplicationController load_and_authorize_resource skip_load_and_authorize_resource :only => :search_hoge ...(略) end |
ハマりがちなんですが、CanCanの権限チェックだけに注視していると、Deviseの認証チェックにひっかかってたりする場合があるので、skipなんちゃらをするときは、Deviseのほうもskipする必要があるでしょう。
1 2 3 4 5 6 | class HogeController < ApplicationController skip_authorization_check :only => :search_hoge load_and_authorize_resource skip_load_and_authorize_resource :only => :search_hoge ...(略) end |
こんな感じですかねぇ。