我有一种情况,我想为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
这样做:所有Thing
和SubThing
都是可更新的,但SubThing
值为false的editable?
除外。但恕我直言,这不是一种直观的设置方式,而且能力类似乎并不能完全表达我想要实现的目标。
我实际上更喜欢那些能力不是继承的,所以我的第一种方法(恕我直言更清楚地表达了我所追求的)将起作用。
有没有更好的方法来实现这一目标?
BTW,this gist是我写的一个可执行测试用例,用于帮助理解并最终解决(解决?)我的问题。