在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
我只是想更好地理解在不使用块的情况下定义一个能力。有一种方式比另一方更好(也许更快)?
答案 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。