Plugin pour ActiveRecord : method_missing malgré un mixin

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 :

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 :wink:

Aurais-je raté une étape essentielle ?
Merci d’avance ^^

jd a écrit :

d’ActiveRecord, donc de s’en passer pour l’exercice.
méta-programmation habituelles pour la création d’un plugin, mais
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 :wink:

Aurais-je raté une étape essentielle ?
Tu t’es basé sur le code d’un plugin existant ou pas ?

Car j’ai pas l’impression que ca soit la bonne manière de faire pour
ajouter ta méthode. Rails est hélas une catastrophe par rapport à Ruby
sur l’inclusion de mixins typiquement.


Cyril M.

Non, from scratch. Mais j’ai suivi les indications usuelles, à partir
du guide The Basics of Creating Rails Plugins — Ruby on Rails Guides, du railscast de
Ryan B. sur les plugins. J’ai également essayé une méthode plus
directe (sans module personnel), façon
typed_serialize/lib/typed_serialize.rb at bd2e4dd095a83f15e85e742b902b02346551b8bb · jqr/typed_serialize · GitHub,
mais pas plus de succès.

En adoptant une voie médiane, j’ai réussi : http://pastie.org/556567
Pas de namespace perso, c’est dommage… j’essayerai plus tard.

Reste à faire fonctionner le plugin en lui-même, maintenant :wink: