質問: 初めましてヤミタケと申します。 RailsでDeviseを用いて管理画面を実装することについて質問させてください。 DeviseでAdminユーザーを作り,ログイン認証を用いて `admin/`以下のアクセスを制御したい時、 僕は3通り程の実装方法を思いつくのですが、どのように組むのがきれいにわかりやすくできますでしょうか? Railsのコーディング規約や思想など正しく理解できていないかもしれないので、そこも踏まえてアドバイス頂けると幸いです。 ###### adminようのroutes.rb ``` # routes.rb # admin/以下はadminの認証を必要とする。 controllers/admin/配下にcontrollerを配置する。 devise_for :admins, # path: "admin", path_names: { sign_in: 'login', sign_out: 'logout' } , controllers: { sessions: "admin/sessions" } namespace :admin do root 'dashboard#index' resouces :items ##//// ## admin画面で管理していくもの ##//// end ``` ###### 共通でかけたい処理(とりあえず) ``` layout 'admin' before_action :authenticate_admin! ``` --- > > 1 concernsに共通処理を書いて各コントローラーで読み込む。 > > などの記述をcontrollers/concerns/adminable.rb などに記述し、admin/以下のcontrollerでそれぞれincludeする。 > > > --- > > 2 継承元のcontrollerを作成して共通処理を記述する。 > > controllers/admin/Admin/base_controller.rb などを記述して共通処理をここに書く > > > ``` class Admin::DashboardController < Admin::BaseController ``` > > 3 cancan,rolifyなどのgemで権限管理を行う。 > > admin配下のCRUDの権限をadmin以外与えないようにする。 > > > --- 管理画面のあるシステムは何度か作ってきたことがありますが、作り方がしっくりこずに色々考えていました。 こういう考えがあるなどの気づきでもいいので教えていただけると幸いです。
回答: 参考になるかわかりませんが、自身の経験では、 2のパターンが一番やりやすいというか、わかりやすかったです。 Admin::BaseControllerのbefore_filterとかでオブジェクトの引き回し及び権限チェック処理などしておけば、 同一NameSpaceのコントローラではその辺を意識せずに書けるので。 また、before_filterの呼び出し順も理解しやすいですし。 (Moduleでもbefore_filterを宣言できますが、書き方が変化球な感じがするので、あんまりしっくり来ません) ただ、deviceやcancan,rolify等のgemは活用した事がないので、比較は出来ません。