Pregunta

Estoy trabajando en un proyecto Rails 2.3.14, que utiliza 0.6.0 del I18N GEM y 2.3.14 de la gema ActiveSupport. Ambos definen un Hash#slice método (i18n's; ActiveSupport's), pero funcionan de manera diferente: la versión i18n usa Hash#fetch, y así eleva un i18n/core_ext/hash.rb:4:in 'fetch': key not found (IndexError) Excepción si falta alguna clave solicitada, mientras que la versión de ActiveSupport ignora felizmente las claves faltantes, y el resto de ActiveSupport depende de eso feliz ignorando.

En mi aplicación, la versión I18N se carga primero (porque, por cierto, Faker la está cargando como una dependencia), por lo que cuando ActiveSupport intenta depender del comportamiento de las teclas ignorantes, obtengo la excepción.

¿Hay alguna manera de decirle a Rails que cargue ActiveSupport antes de Faker e I18N?

¿Fue útil?

Solución

También puede montar el parche de la clase hash después de que se requieran las gemas. Podrías pegar el contenido del hash/slice de ActiveSupport en tu aplicación en algún lugar. La URL se puede encontrar aquí:

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

Sin embargo, eso anularía las definiciones de las gemas, así que YMMV.

Otros consejos

Utilicé la idea de @Eugene de volver al método de ActiveSupport (por lo que obtiene la marca de verificación verde feliz), pero lo hice de la manera que evita duplicar el código. Primero probamos para ver si estamos usando la versión i18n, y si lo somos usamos remove_method Para eliminarlo (se agregó abriendo la clase) y dejar que el módulo ActiveSupport 2.3.14 se complete (nota que no usé undef, que también elimina la anulación del módulo).

Entonces, en un inicializador se convierte en el código:

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 no puede controlar el orden de carga, puede probar el método en esta publicación de blog http://banisterfiend.wordpress.com/2010/11/04/baking-module-methods-into-classes-with-alias_method/

Lo usé y funcionó para mí, pero eso fue con módulos que había escrito yo mismo.

Abrí un problema en el proyecto i18n para hacer que Slice sea más segura y creé un PR para implementarlo. Puedes encontrar el problema / PR en https://github.com/svenfuchs/i18n/pull/292.

Para parchear manualmente, solo puedes agregar if has_key?(key) Después de la búsqueda.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top