1

在 cancan 能力类中定义能力时...

这是:

 can :manage, Area, :location => { :company => { :manager => { :user_id => user.id } } }

与此相同:

 can :manage, Area do |area|
      area.location.company.manager.user_id == user.id
 end

我只是想更好地理解在不使用障碍的情况下定义能力。一种方式比另一种更好(也许更快)吗?

4

2 回答 2

3

两者应该是相同的,但是如果其他人正在阅读您的代码,则第二种方式会更加清晰。我肯定会推荐使用第二种方式。如果困扰你的是占用多行,你可以写:

can( :manage, Area ) {|area| area.location.company.manager.user_id == user.id }

这可能比任何其他选项都更干净(当与一堆其他规则堆叠时)。

于 2012-08-29T02:45:38.820 回答
2

正如这里所说:

https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks#fetching-records

使用块的最大优点是它accessible_by 仍然可以工作。如果您使用块并且还想使用accessible_by,则需要手动添加SQL where 子句,这不是很干,如果可能的话IMO 应避免使用。

于 2013-08-20T01:49:07.487 回答