Dagi3d v4

Parche para acl_system

Ahora estoy desarrollando un programa de gestión con Ruby On Rails donde necesitaba usar algún sistema de control de privilegios dentro de la aplicación. Tras investigar un poco opté por usar acl_system, que parecía bastante sencillo de usar y era más que suficiente para lo que necesitaba, ya que permite restringir el acceso a los métodos del controlador y delimitar partes de la vista para usuarios que tengan un determinado 'rol' .
El único inconveniente era que si dentro del controlador quería preguntar por un rol en concreto para hacer cosas más específicas, tenía que hacer algo así:
if current_user.roles.map { |role| role.title }.include?("admin")
...
end
Aunque funcionaba perfectamente, pensaba que quedaría mejor si le añadía un pequeño parche al plugin acl_system que permitiese hacer algo del tipo
if current_user.has_admin_role?
...
end
Así que aprovechando el potencial de ruby, en unas pocas líneas de código conseguí dar con la solución:
module Dagi3d

  module RoleModel
    def self.included(mod)
      mod.extend(ClassMethods)
    end
    
    module ClassMethods
      
      def has_roles
        include InstanceMethods
      end
      
    end # ClassMethods 
    
    module InstanceMethods
      
      def method_missing(method, *args)
      
        if method.to_s =~ /has_(\w+)_role\?/
          self.roles.map {|role| role.title}.include? $1
        else
          super
        end
      end #method_missing
      
    end #InstanceMethods
  end
end
Para hacerlo andar, bastaría con añadir el módulo en la carpeta del plugin e incluirlo en el fichero init.rb:
require 'caboose/logic_parser'
require 'caboose/role_handler'
require 'caboose/access_control'
require 'caboose/role_model'
 
ActionController::Base.send :include, Caboose
ActionController::Base.send :include, Caboose::AccessControl
ActiveRecord::Base.send :include, Dagi3d::RoleModel

Y ya por último, llamar en nuestro modelo al método de clase 'has_roles':
class User < ActiveRecord::Base
  
  has_roles
  ...
end

Deja un comentario
*: campos obligatorios. La dirección de correo no será publicada