Domanda

Sto lavorando su un progetto di Rails 2.3.14, che utilizza 0.6.0 del i18n gemma e 2.3.14 della gemma ActiveSupport. Entrambi questi definire un metodo Hash#slice ( di i18n ; di ActiveSupport ), ma essi funzionano in modo diverso:. l'i18n utilizza la versione Hash#fetch, e così solleva un'eccezione i18n/core_ext/hash.rb:4:in 'fetch': key not found (IndexError) se un tasto qualsiasi richiesta non è presente, mentre la versione ActiveSupport ignora felicemente chiavi mancanti, e il resto del ActiveSupport dipende da quella felice ignorare

Nella mia app, la versione i18n sta caricando prima (a causa, tra l'altro, falsario sta caricando come una dipendenza), così quando ActiveSupport cerca di dipendere dal comportamento-keys ignorare-mancanti ottengo l'eccezione.

C'è un modo per dire Rails per caricare ActiveSupport prima faker e i18n?

È stato utile?

Soluzione

Si potrebbe anche scimmia rattoppare la classe Hash dopo sono richieste le gemme. Si potrebbe semplicemente incollare il contenuto del del ActiveSupport hash / slice.rb nella vostra applicazione da qualche parte. L'URL può essere trovato qui:

https: // GitHub. com / LIFO / docrails / blob / master / ActiveSupport / lib / active_support / core_ext / hash / slice.rb

Che sarebbe ignorare le definizioni delle gemme, però, così YMMV.

Altri suggerimenti

Ho usato @ idea di Eugenio di ritornare alla modalità di ActiveSupport (e così ottiene il segno di spunta verde felice), ma lo ha fatto in quali modo da evitare la duplicazione del codice. Primo test abbiamo per vedere se stiamo utilizzando la versione i18n, e se siamo usiamo remove_method per spazzare fuori (è stato aggiunto aprendo la classe) e lasciare che il modulo di riempimento ActiveSupport 2.3.14 a (nota non l'ho fatto uso undef, che cancella anche la sostituzione del modulo).

Quindi, in un inizializzatore va il codice:

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

Se non è possibile controllare l'ordine di carico, si potrebbe provare il metodo in questo post del blog http://banisterfiend.wordpress.com/2010/11/04/baking-module-methods-into-classes-with-alias_method/

ho usato e ha funzionato per me, ma che era con moduli io stesso aveva scritto.

Ho aperto un problema sul progetto i18n per rendere fetta più sicuri, e ha creato un PR per la sua attuazione. È possibile trovare il problema / PR a https://github.com/svenfuchs/i18n/pull/292 .

Per la patch manualmente da soli, si può semplicemente aggiungere if has_key?(key) dopo il recupero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top