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