3 votes

Comment faire un monkeypatch d'une gemme existante (moteur Rails) ?

Je débute avec Ruby et Rails 3. Il existe un moteur Rails (packagé sous forme de Gem) que j'aimerais utiliser mais il ne fonctionne pas exactement comme je le voudrais. Je veux faire quelques légères modifications mais je ne veux pas avoir à créer ma propre version forkée. Je pense que c'est là que le singe Parcheando devient utile.

Étant nouveau à Ruby (et venant d'un fond PHP) monkey Parcheando est un nouveau concept pour moi. Comment pourrais-je m'y prendre pour singer Parcheando une gemme existante, et comment pourrais-je organiser mes modifications ? Je suis à la recherche de quelques approches de "meilleures pratiques" à ce sujet.

1voto

Steve Ross Points 2709

C'est une question très large car vous n'avez pas mentionné quel gemme ou comment vous vouliez modifier le comportement, mais...

En général, la façon d'aborder ce problème (une façon d'aborder ce problème) est d'ouvrir la gemme. Utilisez un éditeur qui peut ouvrir tous les fichiers afin de pouvoir passer facilement de l'un à l'autre. En regardant la gemme, déterminez quelle classe contient la fonctionnalité que vous voulez modifier.

Donc, vous allez dans votre répertoire de test ou de spec et vous écrivez un test comme :

# Write tests to your API the way you want to write
# your code, not how you expect you *will* write that
# code.

def test_it_spits_out_my_awesome_error_message
  # some setup code
  assert_equal my_obj.spit_out_error_message, "some expected error message"
end

et exécutez vos tests. Bien sûr, ils échouent car votre nouvelle fonctionnalité n'est pas en place.

Maintenant, disons que votre monnaie va dans spit_out_error_message en classe AwesomeAuthentication . Vous pouvez créer une classe dans votre projet -- probablement dans lib/awesome_auth.rb ou quelque chose comme ça. Dans cette classe, vous faites ce qui est décrit ici : Rails 3 : alias_method_chain toujours utilisé ? . Vous voudrez aussi lire ceci : http://yehudakatz.com/2009/03/06/alias_method_chain-in-models/ car il décrit la modification d'une classe existante à l'aide de cette technique (faites défiler jusqu'en bas).

Vous créez donc un nouveau spit_out_error_message Pour cela, il suffit de le bricoler comme décrit ci-dessus et de refaire les tests.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X