2017-04-24 71 views
0

我创建一个场所上市程序,为此,我需要分配特定用户的经理对某些场所,角色“venue_manager”下。经理只能访问分配给他/她的场地。上市地点与基于角色管理器应用程序

我真的不能找出理想的方式来做到这一点。 在此先感谢!

回答

1

基本上,你必须在2份分割在这里你的应用程序:

分配特定用户的经理对某些场所,角色 “venue_manager”下。

您可以has_and_belongs_to_many协会,为用户/地点在那里的场地可以有很多管理人员和用户可以经理很多场馆做到这一点。您还可以使用角色来简化它,所以无论您何时将某位经理分配到某个场地,只需在roles列表中添加新角色即可!角色可以是这样的:["venue_A_role", "venue_B_role", "venue_C_role"], generated like "venue_#{venue.name}_role"

经理应该只能访问分配给他场馆/她

可以在控制器动作检查这,大概show,如果当前用户实际可访问到特定场所(使用角色或关系)。 如果你使用的角色像上面,你可以检查这样的: venue = Venue.find(params[:id]) if current_user.roles.includes? venue.role_name ........ end 其中#role_name只是在Venue类负责生成名称作为角色的方法!

我会建议使用一些授权库像权威人士或惨惨您的身份验证逻辑会从控制器中分离出来。

希望这会帮助你!

+0

好吧,这也是一个不错的办法,目前我所做的是, 我有一个'的has_many:managed_venue, - > {} Venue.all,CLASS_NAME:我在我的用户已经使用“Venue'' 关联。 rb class 我将场地分配给用户,然后当我需要访问时,我只需要 '@venues = current_user.managed_venues' –

+0

好吧,最后一件事就是制作授权逻辑,用户只能访问他的场地!你可以在VenuesController#show中通过检查current_user.managed_venues包含该特定地点,然后执行一些适当的操作! – zauzaj

+0

是的,我在api控制器中有一个辅助方法,在这里它检查用户的角色类型以及场景是否存在于current_user.managed场地中。 现在很好用! 谢谢! :d –

0

在用户表中,您可以添加要与相关联的任何角色布尔列。您可以将它们初始化为默认值为零,然后在用户控制器中编写方法来切换它们:@user.toggle!('venue_manager')。最后,您可以检查您的视图或控制器@user.venue_manager值是零还是一。

+0

是的,但我需要一个用户只能访问,我分配给用户的特定场所的访问。例如,我有地点AB&C,而且我有一个用户X.我可能需要能够为场地A和B分配对用户X的访问权 –

+0

然后,您可以使用一个单独的表格,您可以分配完整的场地从用户表到场地表的一对多关系。 – DevJem

相关问题