Rails4从模型方法访问controller_name

时间:2015-10-26 17:18:40

标签: ruby-on-rails ruby-on-rails-4

我有基于用户角色的访问控制。用户有很多角色。 每个角色都可以访问某些控制器,操作和范围。

我在用户模型中有方法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>

我理解错误,但可以找到解决方案,或者是否可以找到解决方案。

2 个答案:

答案 0 :(得分:0)

在您的模型中,您可以使用以下方法获取标准关联控制器名称:

"#{self.class.to_s}Controller"
  • self指你的模特
  • .class得到它的类
  • .to_s将其类转换为包含其类名
  • 的字符串

如果你需要用snake_case而不是CamelCase编写它,请使用:

"#{self.class.to_s.tableize}_controller"
  • .tableize将模型的CamelCase名称转换为控制器中使用的snake_case名称

答案 1 :(得分:0)

这是我能想到的最佳解决方案:您可以从任何控制器方法访问params[:controller]中的当前控制器名称。

在用户模型中:

def can_control?(params)
  self.permitted_controllers.include?(params[:controller])
end

在任何控制器中:

current_user.can_control?(params)