2012-01-11 11 views
1

私はi18n gemの0.6.0とActiveSupport gemの2.3.14を使用するRails 2.3.14プロジェクトで作業しています。これらの両方ともHash#sliceメソッド(; ActiveSupport's)を定義していますが、これらは機能が異なります.i18nバージョンはHash#fetchを使用するため、要求されたキーが見つからない場合はi18n/core_ext/hash.rb:4:in 'fetch': key not found (IndexError)例外が発生し、ActiveSupportバージョンは不足しているキーをうれしく無視します。 ActiveSupportはその幸せ無視に依存します。i18nのハッシュ#スライスとActiveSupportのハッシュ#スライスの間の名前の衝突を解決する方法

私のアプリでは、i18nのバージョンが最初に読み込まれています(fakerがそれを依存関係として読み込んでいるため)。そのため、ActiveSupportがignore-missing-keysの動作に依存しようとすると例外が発生します。

fakerとi18nの前にActiveSupportをロードするようにRailsに指示する方法はありますか?

答えて

0

あなたは読み込みの順序を制御することができない場合は、私はそれを使用しました、それは私のために働いたが、それは私が自分自身を書いたモジュールとし、このブログの記事http://banisterfiend.wordpress.com/2010/11/04/baking-module-methods-into-classes-with-alias_method/

方法を試みることができます。

+0

また、Fenderをbundlerを使用してテストグループに入れることもできます。 – iain

+0

悲しいことに、私たちはまだ1.8.7です。それを反映するために質問が更新されます。テストグループのフェイカーでは、それでもスペックは失敗します。 – TALlama

1

@ユージーンのアイデアを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

私の方法よりもずっときれいです。名誉! – Eugene

0

私はスライスがより安全にするために国際化プロジェクトに問題を開いて、そしてそれを実現するためのPRを作成しました。問題/ PRはhttps://github.com/svenfuchs/i18n/pull/292にあります。

手動でパッチを適用するには、フェッチ後にif has_key?(key)を追加します。

関連する問題