新手问题 cancancan 不能提供带 hash 条件的 create action 的验证吗?

shaco · 2016年08月24日 · 最后由 shaco 回复于 2016年08月24日 · 1877 次阅读

在我的项目中,有 User,Shop 和 Tag 三个 Model,一个 User 有多个 Shop,一个 Shop 下有多个 Tag,我使用 cancancan 时,需要在 current_shop(current_shop 已经被定义成一个帮助方法,获取到当前的 shop) 下创建 tag 的时候做一下权限验证,代码如下:

#ability.rb
if user.role == 'staff'
  can [:read, :update, :destroy, :create], Tag, :shop_id => user.shops.ids
end

#tags_controller.rb
class TagsController < AdminController
  def new
    @tag = current_shop.tags.build
  end

  def create
    @tag = current_shop.tags.build
    ...
  end
end

但是当我用 staff 账号进行 tag 的新建的时候会提示我没有权限,为什么会这样? 如果我在验证的时候不用哈希参数新建又不会出现问题,代码如下

can [:read, :update, :destroy], Tag, :shop_id => user.shops.ids
can :create, Tag

请教各位!

没用过瞎猜的:

can [:read, :update, :destroy], Tag, shop: { id: user.shop_ids }

#1 楼 @mimosa 谢谢,还真的可以,👍 ,可是为什么直接用 tag 的 shop_id 字段不可以,用嵌套的 hash 却可以呢?

#1 楼 @mimosa 而且为什么其他动作用 shop_id => user.shops.ids 可以实现权限验证而唯独 create 动作不行呢?

#3 楼 @shaco 可能是这种嵌套符合ActiveRecord的查询语法;

can :create, Tag do |tag|
  user.shop_ids.include?(tag.shop_id)
end

#4 楼 @mimosa 谢谢,还是有点困惑,自己再想想!

需要 登录 后方可回复, 如果你还没有账号请 注册新账号