2

configatron を使用して設定値を保存しています。スコープがクラスのメソッド内にある場合を除いて、問題なく構成値にアクセスできます。

Ruby 2.0.0でconfigatron 3.0.0-rc1を使用しています

「tc_tron.rb」という単一のファイルで使用しているソースを次に示します。

require 'configatron'

class TcTron  
  def simple(url)
    puts "-------entering simple-------"
    p url
    p configatron
    p configatron.url
    p configatron.database.server
    puts "-------finishing simple-------"
  end
end

# setup the configatron.  I assume this is a singleton
configatron.url = "this is a url string"
configatron.database.server = "this is a database server name"

# this should print out all the stuff in the configatron
p configatron
p configatron.url
p configatron.database.server

# create the object and call the simple method.
a = TcTron.new
a.simple("called URL")

# this should print out all the stuff in the configatron
p configatron
p configatron.url
p configatron.database.server

コードを実行すると、

{:url=>"this is a url string", :database=>{:server=>"this is a database server name"}}
"this is a url string"
"this is a database server name"
-------entering simple-------
"called URL"
{}
{}
{}
-------finishing simple-------
{:url=>"this is a url string", :database=>{:server=>"this is a database server name"}}
"this is a url string"
"this is a database server name"

「entering simple」と「finishing simple」の出力の間で、configatron シングルトンを取得できない理由がわかりません。

私は何が欠けていますか?

4

1 に答える 1

2

の現在の実装configatron

module Kernel
  def configatron
    @__configatron ||= Configatron::Store.new
  end
end

ここから

Kernelが含まれているためObject、すべてのオブジェクトでメソッドを使用できます。ただし、b/c メソッドはインスタンス変数を設定するだけで、そのストアは各インスタンスでのみ使用できます。グローバルにアクセス可能なストアを提供することがすべての仕事である宝石の奇妙な選択.

v2.4 では、同様の方法を使用してシングルトンにアクセスしましたが、これはおそらくはるかにうまく機能しました。

module Kernel
  # Provides access to the Configatron storage system.
  def configatron
    Configatron.instance
  end
end

ここから

require 'configatron/core'代わりにモンキーパッチを回避し、独自のシングルトンラッパーを提供することで、これを自分で解決できるようです。

于 2013-12-17T01:10:45.347 に答える