【Rails】policiesディレクトリの使い方
目的
railsにapp/policies
ディレクトリを作るときに、中身には何を入れるのかまとめる。
パーフェクトRuby on Railsの9章を読んでいて、コールバック・バリデーションをモデルから分離して、独立したクラスを作る方法を学びました。
- 作者: すがわらまさのり,前島真一,近藤宇智朗,橋立友宏
- 出版社/メーカー: 技術評論社
- 発売日: 2014/06/06
- メディア: 大型本
- この商品を含むブログ (8件) を見る
callbacks
、validators
という他にも、app配下に置いておくものとしてpolicies
というディレクトリが有るようです。ただし、調べてみると
policies
ディレクトリの使い方は、そこまで一般解があるように思えなかったので、一旦まとめておいて今後検討する材料にしようかと思いました。
policiesディレクトリの使い方概要
- punditを使う(わりと一般的?)
- cancancanのavility.rbを、modelに入れずにpoliciesに入れる(avilitiesでもいいと思う)
- 特にgem等は使わず自分でピュアRubyのオブジェクトを定義して入れる
- policyっていうgemを使う(3をちょっと便利にした感じのもの。メンテされてる??)
punditを使う
app/policies
は以下のようなクラスが入ります
# app/policies/post_policy.rb class PostPolicy attr_reader :user, :post def initialize(user, post) @user = user @post = post end def update? user.admin? or not post.published? end end
punditの使い方に関しては以下を
るびま
参考
Railsを責務に応じてリファクタリングするための9つのパターン | Simplie Post
gemを自然に使うとこうなるため、サンプルには事欠かなさそう。
cancancanのavility.rbを、modelに入れずにpoliciesに入れる
app/models/avility.rb
が肥大化してイヤだ!というときにapp/policies
に入れるという選択肢があるらしい。
中規模Web開発のためのMVC分割とレイヤアーキテクチャ - Qiita
http://blog.thefrontiergroup.com.au/2015/05/separating-abilities-in-cancan/
サンプルがあまり多くないので、上記ふたつをよく読んでから
特にgem等は使わず自分でピュアRubyのオブジェクトを定義して入れる
ちょっと古めの記事ですが、以下の記事で出て来るPolicy Objectのことです。
7 Patterns to Refactor Fat ActiveRecord Models
典型例は以下でしょうか
Policy Object – Steve Robinson – Medium
punditとpolicy objectがおなじpolicyでややこしいから、名前を変えたよという話?
https://sethvargo.com/authorizers-extractors-and-policy-objects/
policyというgemを使う
メンテされてなさそうですが、自分で作ったpolicy objectとcontrollerの橋渡しをしてくれるようなgemのようです
http://eng.joingrouper.com/blog/2014/03/20/rails-the-missing-parts-policies/
まとめ
今後の方針としては以下のような形で使い分けていきたい
- アクションベースのシンプルな権限管理にはpundit
- ロールベースの権限管理はcancancanを使う。
app/policies
は必要になったら作る - 条件が複雑なロジック(アドやレコメンドを出すかどうかみたいな?)がたくさんある場合にはpolicy objectを作る。たくさん無いときはserviceとかmodelに入れれば良さそう
gemの使い方はgemに合わせるわけですが、そうでない場合はcallback、validators同様、そのロジックが業務上重要で複雑な場合は、早めにクラスをわけてメンテし易いように保ちましょう、という話でした。