你如何处理a:在父对象定义的cancan中创建权限?

时间:2012-02-21 09:46:21

标签: cancan

假设您正在为Blogger编写软件。

每个用户只有在博客所有者的情况下才能创建博文。 CanCan通常会在这种情况下定义能力检查:

user.can? :create, Post

但是,如果用户是当前博客的所有者,则用户只能创建帖子,并且无法仅使用其类名引用当前博客。我真正需要做的是:

user.can? :create, Post, @current_blog

这样在cancan定义中我可以说

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

这是可能的还是我在接近这个方面感到困惑?

2 个答案:

答案 0 :(得分:8)

根据当前对象的父级定义一种能力:

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

这将确保当前用户只能为他们所有的博客创建新的帖子记录。

  • 使用Post.blog_id查找父Blog条记录
  • Blog.user_id字段与current_user.id字段
  • 进行比较

还要确保在加载和授权Post资源时使用:through声明,以便CanCan知道父记录是谁。

PostsController:

load_and_authorize_resource :through => :blog

有关详细信息,请参阅GitHub上的CanCan wiki

答案 1 :(得分:0)

您可以使用

  

user.can? :create_posts,@ current_blog

  

user.can?:update,@ current_blog

而不是

  

user.can? :create,Post,@ current_blog

。当然,您可能需要从new中取出createload_and_authorize_resource行动。并自己测试“授权”

  

def new
  未经授权!如果不能? :create_posts,@ current_blog
  端