Introduction of record_with_operator

Post on 08-May-2015

2.206 views 1 download

description

Rails plugin to set created_by, updated_by, deleted_by to ActiveRecord objects. Supports associations.

Transcript of Introduction of record_with_operator

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日水曜日