1

Pryを使用するのは初めてですが、Sinatraアプリで実行されているラックミドルウェアインスタンスにアクセスするための適切なコマンドが見つかりません。エラーが発生するアプリの部分を設定binding.pryしましたが、問題は結果を返さないヘルパーにあり、ミドルウェアによって環境に入力された情報から結果を取得します。にアクセスしようcdとしましRack::GeoIPCityたが、インスタンス情報にアクセスできませんでした。

だから、私は地元の人、ヘルパー、そして環境をチェックすることができます-Sinatraアプリのコードからミドルウェアに到達するにはどうすればよい ですか?

例えば

class App < Sinatra::Base
  # inside the Sinatra app
  use Rack::GeoIPCity, :db => File.expand_path( File.join(File.dirname(__FILE__), "assets/GeoLiteCity.dat"))

  def geo_city_info
    h = {}
    env.select{|x| x =~ /^GEOIP/ }.each {|k,v|
      h[k.split("GEOIP_").last.downcase] = v
    }
    OpenStruct.new( h )
  end

  get "/home" do
    geo = geo_city_info
    binding.pry
  end

end

したがって、が呼び出された時点で、(SinatraがRackのenvに提供するヘルパーである)binding.pryに簡単にアクセスでき、必要に応じて、内部にバインディングを簡単に追加できます。しかし、これらのバインディングからにアクセスすることはできません。ロードされたアプリケーションコードの一部である必要があるため、そこに移動するのに役立つコマンドがあることを期待しています。geoenvgeo_city_infoRack::GeoIPCity

もちろん、ミドルウェアのコードファイルを開いてpryバインディングを入れることはできますが(Bundlerを使用してすべての依存ライブラリを/ vendorにインストールするため)、これを行う方法を知っていれば、それ。

4

1 に答える 1

2

何をしようとしているのかわかりませんが、できます

  • モンキーパッチをミドルウェアクラスに適用して、内部でこじ開けを使用します

  • ソースコードから直接接続する(私が理解したことはあなたが望んでいないこと)

  • Sinatraの「use」メソッドを試して、ミドルウェアスタックから必要なミドルウェアにアクセスします

それが私の考えです、それが役立つことを願っています

編集後:

これを確認してください。@middlewareインスタンス変数にアクセスして、使用されているミドルウェアを取得できます。

于 2012-11-08T16:33:33.853 に答える