Bonjour. Pour donner en quelques mots le contexte, je me suis pris de
faire un plugin (première tentative) pour doter ActiveRecord d’une
fonctionnalité de sérialisation dans le genre de «
serialize :un_attribut[, SaClasse] » mais utilisant Marshal au lieu et
place de YAML, donc quelque chose du genre : « marshalize :un_attribut
[, SaClasse] » (dans un model).
Il existe une sorte de hooker interne par le module
ActiveRecord::Serialization pour créer ce genre de chose, mais je me
suis dit que c’était une bonne occasion d’étudier les entrailles
d’ActiveRecord, donc de s’en passer pour l’exercice.
Après un script/generate plugin marshalize, et après avoir généré un
scaffold pour une table de test birds / modèle Bird avec un attribut
songs (type text), mon code ressemble à ceci :
- models/bird.rb : http://pastebin.com/f6acb09db
- vendor/plugins/marshalize :
- init.rb : http://pastebin.com/f3a26d8ad
- lib/marshalize.rb : http://pastebin.com/f59317de3
Sur le papier, il me semble avoir suivi à la lettre les indications de
méta-programmation habituelles pour la création d’un plugin, mais
quelle que soit la variante, je bute sur la même erreur, du type :
/opt/ruby1.9/lib/ruby1.9.1/gems/1.9.1/gems/activerecord-2.3.2/lib/
active_record/base.rb:1964:in method_missing': undefined method
marshalize’ for #Class:0xab925d0 (NoMethodError)
En gros, il me semble que le code du plugin n’ai pas exécuté, ce qui
expliquerait que le mixin n’a pas eu lieu et que la méthode n’est pas
disponible (la ligne 1964 correspond à un appel à super pour le
method_missing d’ActiveRecord, marshalize ne correspondant à aucun
DynamicFinder ou autre). Cela dit, le #Class:... m’intringue, je
m’attendais à du #Bird:.... Bref, je suis un peu perdu, et préfère
demander conseil en même temps que je recherche la source de mon
erreur
Aurais-je raté une étape essentielle ?
Merci d’avance ^^