2012-05-28 4 views
24

とハッシュ:私はconfig["host"]のように、このハッシュにアクセスすることができ私はYAMLファイルからいくつかの設定をロードしていた非Railsのプロジェクト持ち無関心アクセス

config = YAML::load(File.open("#{LOG_ROOT}/config/database.yml")) 

を、config["username"]など

I無関係のアクセスが必要なので、:host"host"の両方を使用できます。

理由は、このハッシュを渡しているプロジェクトの宝石の1つが、シンボルを使用してアクセスしているように見えますが、現在は失敗しています。

このシナリオで無関係のアクセスでハッシュを作成するには、どのような方法が最適ですか?

+10

をあなただけの '「active_support/core_ext /ハッシュ/ indifferent_access''必要がなかった理由何らかの理由があり、そしてあなたの解決策はありますか? – Casper

+2

私はactive_support gemをインストールしておらず、この機能を利用するためにインストールする必要があるのか​​不思議でした。 – Josnidhin

+0

あなたがしたくない場合は、無関係なアクセスクラスを使用してコードをコピーして自分のハッシュに貼り付けます。私はRailsのソリューションを見ていないが、私は自分自身を前に書いた.LOCは50を超えることはできない。 –

答えて

15

設定ハッシュは、キーの文字列化バージョンの値を返してみましょう:

config = {"host"=>"value1", "Username"=>"Tom"} 
config.default_proc = proc{|h, k| h.key?(k.to_s) ? h[k.to_s] : nil} 
p config[:host] #=> "value1" 

毎回default_proc実行キーがハッシュに見つからないとき。これは無関係アクセスの半分に過ぎないことに注意してください。:hostが存在する場合、config["host"]はnilになります。それはあまりにも動作するように持っている場合:あなたはレールを使用していない場合でも

config.default_proc = proc do |h, k| 
    case k 
    when String then sym = k.to_sym; h[sym] if h.key?(sym) 
    when Symbol then str = k.to_s; h[str] if h.key?(str) 
    end 
end 
+8

これは '[] 'を介してアクセスするためには動作しますが、' delete'のようなものは正しく動作しません。 – iain

+2

'host'と:hostに異なる値が割り当てられています!あなたのハッシュに 'host'キーがあり、key:hostを追加した場合第2のものはthを上書きしない最初の1つ! – wrzasa

42

Active Support Gemをインストールすると、数KBのディスク容量を除いて何も失われません。

require 'active_support/core_ext/hash/indifferent_access' 

こうすることで、あなたが台無しにあなたの名前空間をに何かを取得されていませんことを確認することができます:あなたのコードでは、あなたが望む機能のみを必要としています。

+1

はい、しかし、このようなものは、記号の代わりに内部的に文字列を使用していると推測していますので、( - "%{version}"%{version:5} .with_indifferent_access.to_hashを破っています:( –

+0

興味深い観察。私はここでも知りませんでした:-)、そして私は、ActiveSupport無関心ハッシュでは実際には動作しません。短期間では、これが改善できるかどうかは言えませんが、この効果のチケットをActiveSupportデベロッパーに提出したい場合は、Rubyコミュニティのために良いことを書いてください。 –

関連する問題