简体   繁体   中英

Rails4 Access controller_name from model method

I have user role based access control. User has many roles. Each role has access to some controllers, actions and scopes.

I have method can_control?(controller) in User model which check if user have access to specific controller. I have similar method to actions.

Then in view or controller I can make simple logic to hide some information or permit access using:

current_user.can_control?(controller_name)

I wonder if it possible to create method in User model which automatically takes controller_name. I tried to define method in model.

def can_control?
    self.permitted_cotrollers.include?(controller_name)
end

But it gives me an error:

undefined local variable or method `controller_name' for #<User:0x007f00e8ceb928>

I understand error, but can find solution or if it possible to have one.

In your model, you can get the standard associated controller name by using :

"#{self.class.to_s}Controller"
  • self refers to your model
  • .class gets its class
  • .to_s converts its class to a string containing its class name

If you need it written in snake_case instead of CamelCase, use this :

"#{self.class.to_s.tableize}_controller"
  • .tableize converts the CamelCase name of your model into the snake_case name used in your controller

Here is the best solution I can think of : You can access the current controller name in params[:controller] from any controller method.

In User model :

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

In any controller :

current_user.can_control?(params)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM