为ActiveRecord继承层次结构定义CanCan功能的正确方法是什么?

时间:2017-06-30 20:41:20

标签: ruby-on-rails inheritance subclass cancan

我有一种情况,我想为ActiveRecord类Thing及其子类SubThing定义单独的功能。不幸的是,这是不可能的,因为看起来子类从其父级继承了这些能力。

我是这样开始的:

class Ability
  include CanCan::Ability

  def initialize
    can :update, Thing
    can :update, SubThing do |st|
      st.editable?
    end
  end
end

但是这不起作用,SubThing可以随时更新,无论其editable?值如何,因为SubThing能力是从Thing继承而来的,永远可以更新。

我这样结束了:

class Ability
  include CanCan::Ability

  def initialize
    can :update, Thing
    cannot :update, SubThing do |st|
      !st.editable?
    end
  end
end

这样做:所有ThingSubThing都是可更新的,但SubThing值为false的editable?除外。但恕我直言,这不是一种直观的设置方式,而且能力类似乎并不能完全表达我想要实现的目标。

我实际上更喜欢那些能力不是继承的,所以我的第一种方法(恕我直言更清楚地表达了我所追求的)将起作用。

有没有更好的方法来实现这一目标?

BTW,this gist是我写的一个可执行测试用例,用于帮助理解并最终解决(解决?)我的问题。

0 个答案:

没有答案