2016-12-23 6 views
1

私のサイトには30の機能のリンクがある管理セクションがあります。私たちは、各顧客サービスの担当者が、これらのページに非常にきめ細かく個別のレベルでアクセスできるようにしたいと考えています(つまり、ジョーにはページAとページBにアクセスできますが、Cではアクセスできません。しかし、Bはそうではない)。PunditまたはCanCanの宝石は、ユーザごとのコントローラごとのパーミッションを許可していますか?

PunditまたはCanCanはそのように機能するのですか、または各管理機能のブール型列を持つユーザーに関連するPermissionモデルを作成する方が良いでしょうか?私はそれが手早く手に入らないのを見て、それを避けることを望んでいました。

+0

Punditは、ユーザIDとユーザの他のすべての属性を含む 'current_user'オブジェクトにアクセスします。私はあなたがそれをユーザ単位でパーミッションを定義するために使用できなかった理由を理解していません。 – moveson

+0

@movesonどこでそのユーザー単位の許可情報をどこに保存するのですか? Userモデルに〜30個の追加カラムを追加して、 'current_user.page_a_access? 'のようにしてください。 –

+1

ユーザモデルに1つの整数カラムを追加し、それらを[bitwise](http://blog.millermedeiros.com/using-integers -to-store-multiple-boolean-values /)を指定します。 [SO](http://stackoverflow.com/questions/9643491/store-multiple-bit-values-in-a-single-table-column)の例です。 – moveson

答えて

2

各機能の列を作成するのではなく、1つの整数列を使用し、ビットマスクを使用してN個のブール値を格納できます。必要に応じて、Bitfieldsのような、あなたのためにこれを行うRubyライブラリがあります。

もう1つの方法は、管理者と機能の間に結合テーブル(habtm関係)を作成することです(まだデータベースがない場合は機能をDBバックアップモデルとして追加します)。ジョインテーブル次に例を示します:

class User < ApplicationRecord 
    has_and_belongs_to_many :features 
end 

class Feature < ApplicationRecord 
    has_and_belongs_to_many :users 
end 

# authorization 
def authorized?(current_user, requested_feature) 
    current_user.features.where(id: requested_feature.id).exists? 
end 
+1

私はBitfieldsの提案について興奮しましたが、32個のブール値に制限されているように見えますが、残念ながらそれは機能しません。後者の解決策は当初考えていたことですが、新しいページを追加するたびにデータベース移行を作成する必要はありません。私は代わりにシリアライズされたハッシュを試してみるつもりだと思う。あなたの助けをありがとう! –

関連する問題