2012-03-02 39 views
1

shops habtm products反之亦然。使用Cancan保证HABTM关系

user has many shopsshop belongs to user

以我Product=>:create形式,我可以检查所有的产物属于使用复选框(它发送shop_ids作为PARAMS)的商店。

什么是确保用户不会创建一个产品,它关联到他不康康舞自己的店最好的方法是什么?

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

目前,我这样做。

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

从此,我读它作为p.shop_ids必须是user.shop_ids一个完整的子集,以获得减法运算之后的空数组。

我不知道,如果我做的任何逻辑上的缺陷或者是有检查?

的一个简单的方法210
+1

我宁愿让这个User模型验证。 – clyfe 2012-03-02 10:11:05

+0

是否有内置的方式或写入自定义验证?我的想法是,这是一个需要'授权'的动作,以便即使在我们通过':validate => false'保存记录的情况下,授权仍然会启动并且说您没有权限创建这个? – 2012-03-02 10:27:36

+0

没有内置。我在模型中执行它,因为我觉得它是一个完整性约束。我相信它也可以在DB中完成。如果您手工跳过验证,您也可以手动跳过授权。 – clyfe 2012-03-02 10:47:39

回答

1

CanCan 2.0对此很有帮助。

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

您可能想尝试一下,但它仍然是阿尔法。

P.S.它有关于ability.rb的主要API更改。值得关注的,如果你决定尝试一下 - >Devise & CanCan — Issues with CanCan 2.0 API

+0

是不是“至少有一个”的语义? – clyfe 2012-03-02 10:45:19

+0

谢谢!我会试试看,从目前的wiki 2.0开始,我看到'can:manage,Project,:group => {:id => user.group_ids}',我想知道这个代码是否是等价的。从复数形式看,似乎并不是这样,但我正在尝试。 – 2012-03-03 02:27:41