Comment résoudre la collision de nom entre la tranche # Hash de i18n et Hash # tranche de la ActiveSupport
-
27-10-2019 - |
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?
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:
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.