Ruby on rails Rails4访问控制器\来自模型方法的名称

Ruby on rails Rails4访问控制器\来自模型方法的名称,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我有基于用户角色的访问控制。用户有许多角色。 每个角色都可以访问某些控制器、操作和作用域 我在用户模型中有一种方法可以检查用户是否有权访问特定的控制器。我有类似的行动方法 然后,在view或controller中,我可以使用以下方法进行简单逻辑,以隐藏某些信息或允许访问: current_user.can_control?(controller_name) 我想知道是否有可能在用户模型中创建一个自动使用控制器名称的方法。我试图在模型中定义方法 def can_control? self

我有基于用户角色的访问控制。用户有许多角色。 每个角色都可以访问某些控制器、操作和作用域

我在用户模型中有一种方法可以检查用户是否有权访问特定的控制器。我有类似的行动方法

然后,在view或controller中,我可以使用以下方法进行简单逻辑,以隐藏某些信息或允许访问:

current_user.can_control?(controller_name)
我想知道是否有可能在用户模型中创建一个自动使用控制器名称的方法。我试图在模型中定义方法

def can_control?
    self.permitted_cotrollers.include?(controller_name)
end
但这给了我一个错误:

undefined local variable or method `controller_name' for #<User:0x007f00e8ceb928>
未定义的局部变量或方法“controller\u name”#

我理解错误,但可以找到解决方案,如果可能的话,也可以找到解决方案。

在您的模型中,您可以通过以下方式获得标准关联控制器名称:

"#{self.class.to_s}Controller"
  • self指的是你的模型
  • .类得到它的类
  • .to_s将其类转换为包含其类名的字符串
如果您需要使用snake_case而不是CamelCase编写,请使用以下命令:

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

在您的型号中,您可以通过以下方式获得标准关联控制器名称:

"#{self.class.to_s}Controller"
  • self指的是你的模型
  • .类得到它的类
  • .to_s将其类转换为包含其类名的字符串
如果您需要使用snake_case而不是CamelCase编写,请使用以下命令:

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

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

在用户模型中:

def can_control?(params)
  self.permitted_controllers.include?(params[:controller])
end
在任何控制器中:

current_user.can_control?(params)

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

在用户模型中:

def can_control?(params)
  self.permitted_controllers.include?(params[:controller])
end
在任何控制器中:

current_user.can_control?(params)

我认为您仍然需要将控制器名称作为参数传递,因为您可以控制吗?是一个实例方法,您需要检查用户访问特定控制器的能力。每次加载不同的视图时,控制器名称似乎也会改变。为了便于实现,您可以尝试使用:恐怕您是对的。在这个例子中,这很简单,但是我需要有更复杂的方法,在这里我需要使用这个方法,并且在每个方法中传递它并不像我希望的那样枯燥。但是我认为如果你只是想控制对视图和控制器的访问,你可以尝试
cancancan
gem。我已经尝试了很多次,并且证明了它的有效性。我认为您仍然需要将控制器名称作为参数传递,因为您可以控制吗?是一个实例方法,您需要检查用户访问特定控制器的能力。每次加载不同的视图时,控制器名称似乎也会改变。为了便于实现,您可以尝试使用:恐怕您是对的。在这个例子中,这很简单,但是我需要有更复杂的方法,在这里我需要使用这个方法,并且在每个方法中传递它并不像我希望的那样枯燥。但是我认为如果你只是想控制对视图和控制器的访问,你可以尝试
cancancan
gem。我已经尝试了很多次,并且证明了它的有效性。在这种情况下,self.class始终返回UserController。我想在不同的控制器之间分享这个。例如,在PostController或Post视图中,我可以使用白色:
if can\u control?
而不是
if can\u control?(controller\u name)
。哦,好的。我以前不了解你的实际需要。我要写另一个答案。self.class在这种情况下总是返回UserController。我想在不同的控制器之间分享这个。例如,在PostController或Post视图中,我可以使用白色:
if can\u control?
而不是
if can\u control?(controller\u name)
。哦,好的。我以前不了解你的实际需要。我会写另一个答案。谢谢,我实现了这个,效果很好。这简化了我的申请,不客气。我还希望您的
允许的\u控制器
列表可以为用户组设置,而不仅仅是为用户设置。否则,有一天你可能很难维护这个系统。谢谢,我实现了这个,并且工作得很好。这简化了我的申请,不客气。我还希望您的
允许的\u控制器
列表可以为用户组设置,而不仅仅是为用户设置。否则,有一天您可能很难维护系统。