所以,这是我的问题。我目前正在为rails网站构建一个简单的身份验证系统。我有3个类:Person,Session和Role。在我的Person模型中,我定义了method_missing
来根据this guide动态捕获角色。
在我的application_controller中,我有一些处理登录和注销的逻辑,其结果通过以下方式为我提供了当前登录的用户:
@user = @application_session.person
其中@application_session
是当前会话
现在在我的一个控制器中,除非他们是管理员,否则我不希望任何人能够做任何事情,所以我包括:
before_filter @user.is_an_admin?
这会引发NoMethodError
,即使我的模型中定义了method_missing
。我尝试定义is_an_admin?
,让它总是作为测试返回true,并且有效。
根据this question,我认为问题可能与代理关联有关。当我跑:
puts @user.proxy_owner
我得到一个会话对象,因为每个用户(Person)可以有很多会话,我从当前会话中获得了我的用户(Person)。
我很困惑为什么@user.is_an_admin?
没有在我的Person控制器中调用method_missing方法。如果您需要更多信息或代码段,请与我们联系。
我在Ruby 1.9上使用Rails 3
答案 0 :(得分:0)
我认为method_missing对这样的任务来说太过分了。
现在,如果您有Session类,其属于User_to,那么您可以拥有:
class Session
belongs_to :user, :extend => PermissionMixin
end
class User
include PermissionMixin
end
module PermissionMixin
def admin?
if cond
true
else
false
end
end
end
P.S。检查cancan,或许它会更好地满足您的需求。
答案 1 :(得分:0)
我已将method_missing
方法移至我的application_controller.rb
,从而解决了这个问题。我稍微改变了方法的逻辑以检查用户,如果找到,则动态检查角色。如果事情不是犹太人,我将方法重定向到root_url
,或者如果用户匹配请求的角色,则返回true。
最后,在我的报告控制器中,我使用before_filter :is_an_admin?
并得到了我想要的结果。但是,我仍然不清楚为什么必须在我的应用程序控制器中定义method_missing
而不是直接在Person(aka @user
)模型中定义?
答案 2 :(得分:0)
我在我的系统中使用类似的权限检查来检查用户>角色>权限关联:
User.current_user.can_sysadmin?
在我的控制器中,我必须使用:
User.current_user.send('can_sysadmin?')
这对你也有用。