2011-09-11 15 views
0

私は以前CanCanを使っていましたが、それは素晴らしいですが、カスタマイズ可能なロール管理は必要ないこともあります。時々、私は管理者と他の人とを区別する必要があります。だから、私は通常、保護する必要があるコントローラとメソッドのために:authenticate_admin!メソッドを書いています。Railsでのプラグイン以外のロール管理

私がもう少し複雑に感じたことは、ユーザーが所有するリソースのみを管理できることです。ユーザーはpostsを作成できますが、作成していない投稿を更新または破棄することはできません。だから、私は他の人たちがこれを最もドライな方法でどう扱ってきたかに興味があります。

ここに私の頭の上から、私がやったものだ:

アプリケーションコントローラで:次に

def user_can?(resource_user_id, current_user_id) 
    return true if current_user.is_admin 
    return true if resource_user_id == current_user_id 
end 

、問題のコントローラでは、私は

before_filter :can_manage_project?, :except => [:new, :create] 
ような何かを行います

protected 
    def can_manage_project? 
    @project = Project.find(params[:id]) 
    return true if user_can?(@project.user_id, current_user.id) 
    redirect_to user_path(current_user), :flash => {:error => "Sorry, you're not allowed to do that."} 
    end 

比較的簡単な作業のために多くのコードが好きです。あなたはこの仕事をどのように処理しましたか?私はもっ​​と優雅な解決策があると確信しています - 宝石やプラグインを使用するのが不足しています。

答えて

1

私の最初の考えは、タイプのdoodadを経由してis_manageable?メソッドでモデルに微妙なビットを抜き出してミックスすることです。リソースコントローラはmanageable_by_current_user?フィルタを取得します(私はそれをどのように自動で行うのかは分かりません)。 は任意のルールをカプセル化することができるので、管理フラグなどのようなものを扱うことができます。

私が最も好きな実装を確認するにはちょっとプレイする必要がありますが、たぶん、多くの人々が標準的なソリューションが提供するコントロールのレベルを必要としないプロジェクトのために掘り起こすだろう何か。

+0

(実装の詳細については軽いので、答えとして投稿しておくべきかどうかは分かりません) –

+0

これは大丈夫です...私は実装についてのさらなる理論も探していました。 – Slick23

+0

* Whew *;)これは実際に私が今週末に演奏しようとしているものですが、同様のもの(もっと細かいことはありますが)とキャンタンゴが私を残しました。 –

関連する問題