Как разрешить столкновение с именем между хэш#Slice I18N и хэш#ActiveSport Hash#

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

Вопрос

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

В моем приложении версия I18N загружается в первую очередь (потому что, кстати, Faker загружает ее как зависимость), поэтому, когда ActiveSupport пытается зависеть от поведения игнорирования-пропусков, я получаю исключение.

Есть ли способ сказать Rails загрузить ActiveSport перед Faker и I18N?

Это было полезно?

Решение

Вы также можете обезминуть патч хэш -класс после необходимости драгоценных камней. Вы можете просто вставить содержимое Hash/Slice.rb ActiveSport's Hash/Slice.rb в ваше приложение. URL можно найти здесь:

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

Это будет переопределить определения из драгоценных камней, так что ymmv.

Другие советы

Я использовал идею @Eugene вернуться обратно к методу ActiveSupport (и поэтому он получает Happy Green Checkmark), но сделал это так, чтобы избежать дублирования кода. Сначала мы тестируем, чтобы увидеть, используем ли мы версию 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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top