使用与accessible_by一起使用的关联编写Rails cancan能力

时间:2013-02-17 08:52:41

标签: ruby-on-rails-3 cancan

处理User所属的Organization应用。一个Organization has_and_belongs_to_many产品,但是organizations_products表。

我希望具有特定角色的User能够管理其Organization的产品。在ability.rb

def initialize(user)
  # ...snip unrelated stuff
  elsif user.is_manager?
    can :manage, Product, do |product|
      user.organization.products.include?(product)
    end

这描述了我想要做的事情,但它在产品控制器中引发了一个例外:

def index
    @products =  Product.accessible_by(current_ability)
end

因为acessible_by can't be used with blocks在能力定义中。如何以与accessible_by兼容的方式编写此功能?

1 个答案:

答案 0 :(得分:0)

can :manage, Product, user.organization.products do |product|
  user.organization.products.include?(product)
end

澄清:CanCan在版本1.6中添加了第三个参数,您可以将其理解为accessible_by使用的范围。用于评估can :manage, @a_specific_product的块,如果您使用其中任何一个 - 范围或块 - 您应该使用两者。

另请参阅:this question,其中大部分都是此版本的副本,the docs