2012-02-21 4 views
7

Blogger用のソフトウェアを作成しているとします。親オブジェクトで定義されているcancanのcreateパーミッションをどのように扱いますか?

各ユーザーは、ブログの所有者である場合にのみブログ投稿を作成できます。彼らは現在のブログの所有者であるだけにそのクラス名を使用して、現在のブログを参照する方法はありません場合は、ユーザーが唯一のポストを作成することができますしかし

user.can? :create, Post 

:カンカンは、通常、このような状況で能力チェックを定義します。私が本当に行うことができるようにする必要がありますすることです:カンカンの定義に私は

can :create, Post do |post, blog| 
    user == blog.owner 
end 

を言うことができることを

user.can? :create, Post, @current_blog 

な可能性や、私はこれに近づいてるかで混乱していますということですか?

答えて

8

@current_blog create_postsは、現在のオブジェクトの親に基づいて能力を定義します。

can :create, Post, :blog => { :user => user } 

これは、現在のユーザーのみがブログ用の新しいポストレコードを作成できることを確認します彼らは彼らの所有者であるということです。

  • はカンカンが誰を知っているので、また、あなたのポストのリソースをロードし、承認したときに:through宣言を使用していることを確認し、親Blog記録
  • current_user.idフィールド

Blog.user_idフィールドを比較して検索しPost.blog_idを使用しています親レコードはです。

PostsController: 

load_and_authorize_resource :through => :blog 

詳しくは、GitHubのCanCan wikiを参照してください。

+1

The:through =>:最終的にブログが取引されました。どうもありがとうございました! – rfsbsb

0

あなたは

user.canを使用することができますか? :

または

user.can @current_blog create_posts、:?代わりに

user.can

@current_blog更新、? :作成、投稿、@current_blog

もちろん、load_and_authorize_resourceからnewcreateのアクションを取り出す必要があります。そして、テスト "承認" 自分で

デフ新しい
不正!もしできないなら? :
エンド

+0

あなたは実際の能力の定義にどのように対処するか知っていますか?通常は 'can:create Post | post_instance | ... 'という形式になっていますので、異なる変数を渡すだけでどうすればうまくいくのでしょうか? –

+0

あなたの例としては 'can(:create_posts、Blog)do | blog | user == blog.owner end'となります。だから、テストは@ CurrentTreeではなく、PostsController.Newで行います。 – Foton

+0

CanCanはCanCanが渡されたオブジェクトの型に基づいてパーミッションを索引付けすると信じているので、それがうまくいくかどうかはわかりません。したがって、 'blog'で渡された場合、ブログのパーミッションを調べます。私は最終的にそれを回避する方法は、新しいオブジェクトを設定することです: 'user.can? :@ current_blog.posts.new'を作成する - その方法で私は投稿オブジェクトを渡し、それでも親を読むことができる –

関連する問題