CanCanを使って権限チェックを実装している場合、以下のように基底のコントローラで権限チェックを行うようになっていると思います。
class BaseController < ApplicationController
# 権限チェック
authorize_resource
# いろいろな共通ロジック …
end
REST の原則に従ってリソース単位でコントローラが定義されていれば、これで問題なく権限チェックが行えます。
しかし、以下のようにリソースと無関係なコントローラを定義したい場合もあると思います。
class HogeUploadController < BaseController
def index
end
end
しかし、そのようなコントローラを定義したとたん、前述の authorize_resource が存在しないリソースに対して権限チェックしようとして、以下のようなエラーが発生します。
Rendering 500 with exception: uninitialized constant HogeUpload
この問題を回避するためには、該当コントローラについては authorize_resource を行わないように修正する必要があります。
また、その場合は自前で権限チェックの処理をフィルタなりで実装する必要があります。
たとえば、前述の hoge_upload_controller.rb は以下のように修正します。
class HogeUploadController < BaseController
# 権限チェックをスキップ
skip_authorize_resource
# 自前で権限チェック
before_filter :check_authorization
def index
end
private
def check_authorization
authorize! :manage, :all
end
end
参考
Authorizing controller actions
https://github.com/ryanb/cancan/wiki/Authorizing-controller-actions
Non RESTful Controllers
https://github.com/ryanb/cancan/wiki/Non-RESTful-Controllers