2009-03-04 11 views
2

私は、ユーザーがプロジェクトへのメンバーシップを持っているRailsアプリケーションを持っています(そして多態的に他のものもあります)。ユーザーにはロールもあります。私はUser#プロジェクトを通常のActiveRecord findのように動作させたいが、管理者がすべてのプロジェクトにアクセスできるようにしたい。 '(例えば、私はもっと定期的にnamed_scope使用することができるようにユーザーアセットを制御するにはどうすればよいですか?

class User < ActiveRecord::Base 
    has_many :memberships, :dependent => :destroy 
    has_many :projects, :through => :memberships, :source => :member, :source_type => "Project" 
end 

class User < ActiveRecord::Base 
    has_many :memberships, :dependent => :destroy 

    def projects 
    if has_role?(:admin) 
     Project.find(:all) 
    else 
     Project.find(:all, :include => :memberships, :conditions => ["memberships.user_id = ?", id]) 
    end 
    end 
end 

class Project < ActiveRecord::Base 
    has_many :memberships, :as => :member, :dependent => :destroy 
end 

class Membership < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :member, :polymorphic => :true 
end 

しかし、私は本当に、むしろこのような何かをしたい:しばらく

は、私はこれを行ってきましたalfred.projects.recent.active ')。

管理者用の新しいメンバーシップを自動的に追加すると機能しますが、すぐに機能しなくなります。

私はUser#projectsインターフェイスを保持します。ここで正しいトラックは何ですか?

多くのありがとうございます。

+0

感謝を!これを攻撃する別の方法があるかもしれません - ActiveRecordオブジェクトの配列をAR関連のように動作させる簡単な方法はありますか?すなわち、projects = Project.find(:all); projects.active.recent - もう一度、ありがとう! – scottburton11

答えて

1

Take a look at activefx's restfull authenticaion tutorial:(安らかな認証チュートリアル)これは、以下の機能を備えたレールのアプリです:

最新の機能

- Login/Logout 
- Restful, with the exception of the "activate" action 
- Namespaced admin and user sections 
- OpenID Authentication with support for incomplete OpenID profiles 
- Roles and permissions 
- Administrative user controller 
- Set roles, activate, enable/disable users 
- Login, permission, and access denied redirection system 
- Member list and public profiles for logged in users 
- Activation, with option to resend activation code 
- Beta invitation system 
- easy on/off functionality, add/remove invites, send emails to 
- pending users 
- Forgot Password/Reset Password 
- Change Password 
- Failed login attempts database logging 
- Recaptcha displayed for more than 5 failed logins 
- Helper methods (link_to_user, if_admin?, etc.) 

This thread will explain how you give owner and administrator access. #28.

幸運。

+0

あなたのgithubリンクは失敗したタコを返します:そのページは存在しません! http://github.com/activefx/restful_authentication_tutorial/tree/master アンダースコアが何とか骨抜きになった – srboisvert

+0

あなたは正しいですか:/私はリンクを更新しました。なぜ私はアンダースコアを使用できないのですか? – atmorell

+0

ありがとうatmorell。 "has_"はこれを単一のリソース用に抽象化するのに適した方法で、私が使っている他のコードをリファクタリングするのに役立ちます。私の唯一の懸念は、current_user.projects.find(:all)のような、現在のUser#projectメソッドと同じであるということです。回答ありがとうございます! – scottburton11

0

個人的には、私が個人的に認めることをしようとしている方法で許可の問題を広げたくありません。

これにはいくつかの理由があります(主に、通常RESTfulでないデザインにつながります)。もう一つは、相反する方法の問題にある。

考えてみてください。

user.projectsはあなたのシステムで何を意味しますか?お使いのモデルでは、2つの意味があります。それは、ユーザーが関与しているすべてのプロジェクト、

  • 存在するすべてのプロジェクト

    1. を意味します。

    このようにシステムをモデル化した場合、多くの異なる意味のメソッドが必要になります。 (あなたが3つ、4つ以上の役割を持っている場合について考えてください)、これは良い方法ではありません。しかし、もっと理由があります。例えば。何人かのユーザーが複数の役割を持っていたら?管理者は通常通常のユーザーです。

    「正しい」ソリューションとは何ですか? さて、これ以上のものはありますが、好きなものはrails-authorization-pluginで使用されているものです。モデルの役割を定義し、コントローラとビューで認可ロジックを実装します。詳細はpluginをご覧ください。

    希望に役立ちます!そうでない場合は、コメントを残してください。

  • +0

    お返事ありがとうございます。 私は所有権と認可を別々に保つために努力していますが、これが唯一の例です。私はそれがおそらく他の方法に広がることに同意しますが、まだ完全に混合することを保証するかどうかはわかりません。 rails-authorization-pluginに試してみましょう。 ありがとう! – scottburton11

    関連する問題