Rails - 使用关联定义cancan能力

时间:2012-08-29 01:27:19

标签: ruby-on-rails cancan

在cancan Ability class中定义能力时......

这是:

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

与此相同:

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

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

2 个答案:

答案 0 :(得分:2)

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

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

与其他选项相比,这可能更清晰(当与其他规则堆叠时)。

答案 1 :(得分:2)

正如它在这里所说:

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

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