假设您正在为Blogger编写软件。
每个用户只有在博客所有者的情况下才能创建博文。 CanCan通常会在这种情况下定义能力检查:
user.can? :create, Post
但是,如果用户是当前博客的所有者,则用户只能创建帖子,并且无法仅使用其类名引用当前博客。我真正需要做的是:
user.can? :create, Post, @current_blog
这样在cancan定义中我可以说
can :create, Post do |post, blog|
user == blog.owner
end
这是可能的还是我在接近这个方面感到困惑?
答案 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
中取出create
和load_and_authorize_resource
行动。并自己测试“授权”
def new
未经授权!如果不能? :create_posts,@ current_blog
端