我有基于用户角色的访问控制。用户有很多角色。 每个角色都可以访问某些控制器,操作和范围。
我在用户模型中有方法can_control?(控制器),用于检查用户是否可以访问特定控制器。我有类似的行动方法。
然后在视图或控制器中,我可以使用简单的逻辑隐藏一些信息或允许访问:
current_user.can_control?(controller_name)
我想知道是否可以在User模型中创建自动获取controller_name的方法。我试图在模型中定义方法。
def can_control?
self.permitted_cotrollers.include?(controller_name)
end
但它给了我一个错误:
undefined local variable or method `controller_name' for #<User:0x007f00e8ceb928>
我理解错误,但可以找到解决方案,或者是否可以找到解决方案。
答案 0 :(得分:0)
在您的模型中,您可以使用以下方法获取标准关联控制器名称:
"#{self.class.to_s}Controller"
如果你需要用snake_case而不是CamelCase编写它,请使用:
"#{self.class.to_s.tableize}_controller"
答案 1 :(得分:0)
这是我能想到的最佳解决方案:您可以从任何控制器方法访问params[:controller]
中的当前控制器名称。
在用户模型中:
def can_control?(params)
self.permitted_controllers.include?(params[:controller])
end
在任何控制器中:
current_user.can_control?(params)