Rulebook est une gem dévéloppée par c00lryguy
Rulebook offre des possibilités pour étendre ses classes Ruby / Ruby on Rails avec des méthodes dynamiques construites sur des expressions régulières.
Vous connaissez sans doute les facilités fournies par ActiveRecord avec les méthodes find_by et find_all_by. Vous pouvez ajouter à ces méthodes le nom d’un attribut sur lequel vous voulez directement rechercher. Le fonctionnement était tout simplement basé sur la méthode magique de Ruby : method_missing. Si la méthode appelée sur un objet ne correspondait pas à une méthode déclarée et qu’elle avait la structure de type find_by_ ou find_by_all_, alors la méthode à method_missing se chargeait de faire la requête associée.
C’est sans doute sur cette idée que Rulebook a été créée. Elle va au delà en vous permettant de définir les structures qui seront prises en compte par method_missing. La définition se fait par une expression régulière qui va créer une liste virtuelle de méthodes.
Par exemple, si on souhaite automatiser les méthodes de vérification du statut (administrateur, simple utilisateur, etc) d’un utilisateur :
require 'rulebook'
#
class User
def initialize(name, status)
@name = name
@status = status
end
#
rule /is_(a_)*(admin|super_user|user)\?/ do |a, status|
@status == status.to_s.to_sym
end
end
#
ryan = User.new('Ryan', :admin)
ryan.is_user? # false
ryan.is_admin? # true
ryan.is_a_user? # false
ryan.is_a_admin? # true
On peut tout autant appliquer cette idée aux méthodes de classe :
require 'rulebook'
#
class User
attr :name, :status
#
def initialize(status)
@status = status
end
#
class_rule /new_(admin|super_user|user)/ do |status|
new(status.to_s.to_sym)
end
end
#
ryan = User.new_admin
ryan.status # :admin
#
brian = User.new_user
brian.status # :user
On remarquera donc qu’à l’heure actuelle, il n’est pas possible d’adjoindre des arguments aux méthodes créées. Cela apporte une grosse limitation mais le projet est tout récent, il évoluera sans doute dans ce sens














