Как устранить конфликт имен между хешем # 18 в i18n и хешем # в ActiveSupport - PullRequest
1 голос
/ 11 января 2012

Я работаю над проектом Rails 2.3.14, который использует 0.6.0 из i18n gem и 2.3.14 из ActiveSupport gem. Оба из них определяют метод Hash#slice ( i18n's ; ActiveSupport's ), но они функционируют по-разному: версия i18n использует Hash#fetch и, таким образом, вызывает исключение i18n/core_ext/hash.rb:4:in 'fetch': key not found (IndexError), если таковое имеется запрашиваемый ключ отсутствует, в то время как версия ActiveSupport успешно игнорирует отсутствующие ключи, а остальная часть ActiveSupport зависит от этого успешного игнорирования.

В моем приложении сначала загружается версия i18n (потому что, кстати, фейкер загружает ее как зависимость), поэтому, когда ActiveSupport пытается зависеть от поведения ignore-missing-keys, я получаю исключение.

Есть ли способ сообщить Rails загружать ActiveSupport до фейера и i18n?

Ответы [ 4 ]

1 голос
/ 11 января 2012

Вы также можете обезьянить патч класса Hash после того, как драгоценные камни требуются.Вы можете просто вставить содержимое файла hash / slice.rb ActiveSupport в свое приложение.URL можно найти здесь:

https://github.com/lifo/docrails/blob/master/activesupport/lib/active_support/core_ext/hash/slice.rb

Это переопределит определения из драгоценных камней, поэтому YMMV.

1 голос
/ 11 января 2012

Я использовал идею @ Евгения вернуться к методу ActiveSupport (и он получил счастливую зеленую галочку), но сделал это таким образом, чтобы избежать дублирования кода. Сначала мы проверяем, используем ли мы версию i18n, и если мы используем ее, мы используем remove_method, чтобы стереть ее (она была добавлена ​​открытием класса), и позволить модулю ActiveSupport 2.3.14 заполниться (заметьте, я не используйте undef, который также стирает переопределение модуля).

Итак, в инициализатор входит код:

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
0 голосов
/ 01 октября 2014

Я открыл вопрос по проекту i18n, чтобы сделать слайс более безопасным, и создал PR для его реализации. Вы можете найти проблему / PR в https://github.com/svenfuchs/i18n/pull/292.

Чтобы исправить себя вручную, вы можете просто добавить if has_key?(key) после извлечения.

0 голосов
/ 11 января 2012

Если вы не можете контролировать порядок загрузки, вы можете попробовать метод в этом сообщении в блоге http://banisterfiend.wordpress.com/2010/11/04/baking-module-methods-into-classes-with-alias_method/

Я использовал его, и он работал для меня, но это было с модулями, которые я написал сам.

...