introduction of record_with_operator
Post on 08-May-2015
2.206 Views
Preview:
DESCRIPTION
TRANSCRIPT
2009-08-25;Mitaka.rb#04;Bistro Epices
Meadowy.org
ユーザー依存ロジックをモデルに集める
- record_with_operatorの紹介
大場光一郎大場寧子 株式会社万葉
2009年8月26日水曜日
多くのWebアプリケーションではユーザーを扱う
2009年8月26日水曜日
ユーザーとモデルにまつわるニーズ
2009年8月26日水曜日
例1:データを作成/更新したユーザーを記録したい
2009年8月26日水曜日
例2:許す操作を
ユーザー毎に変えたい
2009年8月26日水曜日
そうなると
2009年8月26日水曜日
モデルではユーザーが知りたい
2009年8月26日水曜日
こんな風にdef some_callback if user && user.admin? .... endend
2009年8月26日水曜日
実装戦略
2009年8月26日水曜日
ActiveScaffold方式
2009年8月26日水曜日
モデルがControllerのcurrent_userメソッドをたたく
2009年8月26日水曜日
MVC的にスマートでない
2009年8月26日水曜日
モデルにとっての「ユーザー」はcurrent_user
か?2009年8月26日水曜日
常にそうとはいえない
•モデルだけを動作させるときは?•ログインユーザーではないユーザーのための権限をチェックするときは?
2009年8月26日水曜日
そこで
2009年8月26日水曜日
record_with_operator
2009年8月26日水曜日
record_with_operator
•Railsプラグイン•MITライセンス• http://github.com/nay/record_with_operator/tree
2009年8月26日水曜日
installgem install nay-record_with_operator --source http://gems.github.com
2009年8月26日水曜日
ActiveRecordオブジェクトに operator という属性を追加
2009年8月26日水曜日
データベースにcreated_by カラムがあれば自動的に operator.idを記録
2009年8月26日水曜日
同じくupdated_bydeleted_byも記録
2009年8月26日水曜日
created_byがあれば関連creatorでユーザーオブジェクトを取得できる
2009年8月26日水曜日
同じくupdaterdeleterもとれる
2009年8月26日水曜日
operatorは伝搬する
2009年8月26日水曜日
operatorの伝搬
•関連オブジェクト•関連越しに得たオブジェクト
2009年8月26日水曜日
こんな風にparent.operator = userparent.children.each do |c| c.operator # => userend
2009年8月26日水曜日
つまり
2009年8月26日水曜日
1回入れればOKdef some_filter @my_record = MyModel.find(params[:id]) @my_record.operator = current_userend
2009年8月26日水曜日
:forオプションdef some_filter @my_record = MyModel.find(params[:id], :for => current_user)end
2009年8月26日水曜日
ここまでがrecord_with_operatorの仕事
2009年8月26日水曜日
応用
2009年8月26日水曜日
1. named_scope
2009年8月26日水曜日
こんなのが作れる# @company の operator に# セットされたユーザーに許された# ノートを検索するnotes = @company.notes.authorized
2009年8月26日水曜日
関連の拡張とか無名スコープとか使うとできる
2009年8月26日水曜日
2. 必ず操作者を記録させる
2009年8月26日水曜日
適当にモジュールつくって例外なげる
2009年8月26日水曜日
例外@company.save
# operator入れてないと例外出す# ように自分で制限を強くする# こともできる
2009年8月26日水曜日
堅くなるけど、現実的には常に操作者がいるとは限らないので注意
2009年8月26日水曜日
3. フラグとの合わせ技
2009年8月26日水曜日
operator が管理者ユーザーでも管理機能でなかったら無視する
2009年8月26日水曜日
管理機能フラグdef some_admin_filter current_user.as_admin = trueend
2009年8月26日水曜日
モデルで判定
if operator.as_admin? ...end
2009年8月26日水曜日
実績
•某EC•某ポータル
2009年8月26日水曜日
recode_with_operator
•協力者募集!• http://github.com/nay/record_with_operator/tree
2009年8月26日水曜日
top related