0

CanCan とPermissionモデルを使用して、モデルの権限を管理していFolderます。

ユーザーがフォルダーを作成するときに、このユーザーのフォルダーへの書き込み権限を作成したいaction(つまり、ユーザーとフォルダーの両方に属し、フィールドが「書き込み」に設定された権限レコードを作成する)。後で管理者が変更できます (ユーザーは、作成したフォルダーの所有者ではありません)。奇妙なことに、ユーザーが管理者の場合、パーミッションは作成されません。

コールバックを使用Folderして仕事をすることもcurrent_userできますが、モデルで直接利用できるようにすることは良い考えではないと思います。

だからここに私が検討するオプションがあります:

  1. コントローラーでダーティジョブを作成します。私はそれがあまり好きではありません、それはDRYではありません
  2. プロセスをトランザクションにラップして、ジョブを実行するsave_and_grant_permission( user, action )メソッドを作成します。Folder問題は、常にこれを使用することを覚えておく必要があることです。save

だから私は知りたい:

  • 他に代替案があれば
  • この場合のベストプラクティスは何ですか

アップデート

今のところ、解決策2を選択して使用しましたnested_attributes

def save_and_grant_permission( user, action )
  return save if user.admin?
  permission = permissions.where( user_id: user.id ).first
  self.permissions_attributes = [
    {id: permission.try(:id), user_id: user.id, action: action.to_s}
  ]
  save
end

より良い解決策がここに表示されない場合は、質問を閉じて、StackExchange::CodeReview に移動します。

4

1 に答える 1

1

おそらく、フォルダーに作成者の形式でユーザーへの参照を与える必要があります。

フォルダーの作成者に基づいてアクセス許可を設定し、たとえば、フォルダーの作成者のアクセス許可を作成する after_create コールバックを定義できます。

于 2013-03-19T14:30:04.037 に答える