使用Cancan保护HABTM关系

时间:2012-03-02 09:59:01

标签: ruby-on-rails cancan

shops habtm products,反之亦然。

user has many shopsshop belongs to user

在我的Product=>:create表单中,我可以使用复选框(将shop_id作为参数发送)来检查产品所属的所有商店。

确保用户不创建产品并将其与cancan中不拥有的商店相关联的最佳方法是什么?

这似乎是一个非常简单的用例,但我没有找到一个好的例子=(

目前,我正在这样做。

can [:create], Product, do |p|
  (p.shop_ids - user.shop_ids).empty?
end

由此,我读了它,因为p.shop_ids必须是user.shop_ids的完整子集才能在减号操作后得到一个空数组。

我不知道我是否存在任何逻辑缺陷,或者是否有更简单的检查方法?

1 个答案:

答案 0 :(得分:1)

CanCan 2.0对此有好处。

can :create, :products, :shops => { :id => user.shop.id }

您可能想尝试一下,但它仍处于alpha状态。

P.S。它对ability.rb有重大的API更改。值得注意的是,如果你决定尝试一下 - > Devise & CanCan — Issues with CanCan 2.0 API