Comment résoudre la collision de nom entre la tranche # Hash de i18n et Hash # tranche de la ActiveSupport

StackOverflow https://stackoverflow.com/questions/8823968

Question

Je travaille sur un projet Rails 2.3.14, qui utilise 0.6.0 du i18n joyau et 2.3.14 de la gemme ActiveSupport. Ces deux définissent une méthode de Hash#slice ( i18n de , ActiveSupport ), mais ils fonctionnent différemment. la version en i18n utilisations Hash#fetch, et soulève donc une exception i18n/core_ext/hash.rb:4:in 'fetch': key not found (IndexError) si une clé demandée est manquante, tandis que la version ActiveSupport ignore heureusement les clés manquantes, et le reste de ActiveSupport dépend de cet heureux ignorant

Dans mon application, la version i18n chargement premier (parce que, soit dit en passant, Faker chargement comme une dépendance), donc quand ActiveSupport essaie de dépendre du comportement des clés ignorer manquantes, je reçois l'exception.

Y at-il un moyen de dire Rails pour charger ActiveSupport avant Faker et i18n?

Était-ce utile?

La solution

Vous pouvez également patcher singe la classe Hash après que les pierres précieuses sont nécessaires. Vous pouvez simplement coller le contenu de hachage / slice.rb de ActiveSupport dans votre endroit app. L'URL peut être trouvée ici:

https: // GitHub. com / LIFO / docrails / blob / maître / activesupport / lib / active_support / core_ext / hachage / slice.rb

Ce serait passer outre les définitions des pierres précieuses, donc YMMV.

Autres conseils

je @ l'idée d'Eugène de revenir en arrière à la méthode de ActiveSupport (et donc il obtient la coche verte heureux), mais il a fait de telle manière que comme pour éviter de dupliquer le code. Premier test nous pour voir si nous utilisons la version i18n, et si nous sommes nous utilisons remove_method pour essuyer dehors (il a été ajouté en ouvrant la classe) et laissez le remplissage du module ActiveSupport 2.3.14 dans (note que je ne l'ai pas utilisation undef, qui efface également le remplacement du module).

Alors dans un initialiseur va le code:

begin
    {}.slice(:a) # ActiveSupport's slice is fine with this; i18n's is not
rescue IndexError
    class Hash
        remove_method :slice #kill i18n's implementation, allow the ActiveSupport module to work
    end
end

Si vous ne pouvez pas contrôler l'ordre de chargement, vous pouvez essayer la méthode dans ce billet de blog http://banisterfiend.wordpress.com/2010/11/04/baking-module-methods-into-classes-with-alias_method/

Je l'ai utilisé et cela a fonctionné pour moi, mais qui était avec des modules je me avait écrit.

J'ai ouvert une question sur le projet i18n pour rendre tranche plus sûr, et a créé un PR pour la mettre en œuvre. Vous pouvez trouver le problème / PR https://github.com/svenfuchs/i18n/pull/292 .

Pour vous patcher manuellement, vous pouvez simplement ajouter if has_key?(key) après la récupération.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top