有没有其他解决方案,可以在users_controller中的每个方法中添加User.where(organization_id:current_user.organisation_id)?

时间:2019-04-18 11:07:03

标签: ruby-on-rails

我正在尝试执行此操作,因为这些应用程序将由多个组织使用。因此,我希望每个用户只能看到与其组织相对应的数据,我可以在每个控制器的每个方法中添加.where(organization_id:current_user.organisations_id),但这会带来很多变化。 有更好的解决方案吗? 谢谢:)

1 个答案:

答案 0 :(得分:0)

类似的更通用的解决方案是使用cancancan gem的accessible_by(current_ability)(或其他授权的gem解决方案,例如pundit等)进行微调(在引擎盖下,它会执行相同的where(organization...):

ability.rb:

can :manage, SomeModelName, organization_id: user.organization_id
can :read, SomeOtherModel, user_id: user.id

此方法比代码中的硬编码功能更好,因为当访问规则更改时-您不必再次遍历所有代码来更改它们。

其他方式: 实际上,您可以通过default_scope来更改所有查询,并通过将current_user引入模型范围来违反mvc原理,但是我建议您不要这样做-以后使用它会变得非常困难。