我正在开发一个允许用户登录的网站。所有用户都有1个帐户,一个帐户可以有多个订单。用户可以是客户,工作人员或经理。客户永远不是工人,也不是经理。经理也是一名工人。我想根据登录用户的类型提供页面/导航选项的其他部分。
目前我使用一组布尔值将用户标记为特定类型,测试该值,并运行一些if / elsif块以生成用户看到的页面。
class User
include DataMapper::Resource
# ...
# various properties
# ...
property :client, Boolean
property :worker, Boolean
property :manager, Boolean
end
然后我使用before filter来测试用户类型并将结果设置为变量。
before do
@user = session[:user]
if @user.client?
@ura = 'client'
elsif @user.worker?
@ura = 'worker'
elseif @user.manager?
@ura = 'manager'
end
end
然后在我的观点中,我有@ura来玩。在我看来,这已经会给管理者带来麻烦,因为@ura必须同时兼顾工人和工作人员。经理。我可以在我的视图中使用一些或者一些,但我认为更好的解决方案是将用户类型设置为枚举或标记。但我真的不明白如何在我的过程中使用它。
我想知道每个人的优缺点是什么?一个基本的例子,说明如何在@ura中找到合适的值。
答案 0 :(得分:0)
我不确定,但可能是数组将是更好的解决方案:
class User ....
def getRoles
roles = Array.new
roles << "client" if self.client?
roles << "manager" if self.manager?
roles << "worker" if self.worker?
roles
end
end
before do
@user = session[:user]
if(@user.getRoles.index("manager") != nil)
...
答案 1 :(得分:0)
我不记得我是如何解决这个确切问题的(我认为它是针对自行车交付应用程序的),但今天才注意到它仍然没有答案。
所以,就在十年后,即使我不再经常使用 DataMapper,他也是我现在解决这个问题的方法;
当时我并不完全理解系统中用户 Role
的身份验证和授权之间的区别。
class User
include DataMapper::Resource
...
properties
...
property :role, Enum[ :client, :worker, :manager ]
end
class Employee < User
include DataMapper::Resource
...
more properties
end
这样所有用户都可以拥有他们需要的东西,员工可以进一步分为Worker
和Manager
。然后您可以在相应的模型上进行适当的验证。前期代码更多,但更易于维护且更易于扩展,只需向 User
枚举和相应的类添加一个新角色即可。
如果类除了命名空间/逻辑分离之外没有做任何事情,您甚至可以通过一些元编程/反射来从枚举中推断类并在初始化时包含适当的模块。