i18nのハッシュ#スライスとActivesupportのハッシュ#スライス間の名前の衝突を解決する方法
-
27-10-2019 - |
質問
私は0.6.0を使用しているRails 2.3.14プロジェクトに取り組んでいます i18n gem ActiveSupport Gemの2.3.14。これらは両方ともaを定義します Hash#slice
方法 (i18n's; ActiveSupport's)、しかし、それらは異なって機能します:i18nバージョンは使用します Hash#fetch
, 、そしてそれを上げます i18n/core_ext/hash.rb:4:in 'fetch': key not found (IndexError)
要求されたキーが欠落している場合は例外であり、Activesupportバージョンは不足しているキーを喜んで無視し、Activesupportの残りの部分はその幸せな無視に依存します。
私のアプリでは、I18Nバージョンが最初にロードされています(偶然にも、Fakerが依存関係としてロードしているためです)。そのため、ActivesUpportがIngrore-Missing-Keysの動作に依存しようとすると、例外が得られます。
Fakerとi18nの前にRailsにActivesupportをロードするように指示する方法はありますか?
解決
また、宝石が必要になった後、ハッシュクラスにモンキーパッチをかけることもできます。 ActiveSupportのハッシュ/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プロジェクトで問題を開き、スライスをより安全にし、PRを作成して実装しました。問題 / PRを見つけることができます https://github.com/svenfuchs/i18n/pull/292.
手動でパッチを当てるために、追加するだけです if has_key?(key)
フェッチの後。