【问题标题】:How to use pry to access a Rack middleware instance?如何使用 pry 访问 Rack 中间件实例?
【发布时间】:2012-10-28 19:01:09
【问题描述】:

我是使用Pry 的新手,尽我所能尝试,我找不到正确的命令来访问使用 Sinatra 应用程序运行的机架中间件实例。我在应用程序中出现错误的部分设置了binding.pry,但问题在于没有返回任何结果的助手,它从中间件放入 env 的信息中获取结果。我尝试将cding 到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

所以在调用binding.pry 时,我可以轻松访问geoenv(这是Sinatra 为Rack 环境提供的帮助程序),并且我可以轻松地在geo_city_info 中添加绑定,如果我想了。但是,我无法从这些绑定中访问 Rack::GeoIPCity。我希望有一个命令可以帮助我导航到那个位置,因为它必须是加载的应用程序代码的一部分。

当然,我可以打开中间件的代码文件并放入 pry 绑定(因为我使用 Bundler 将所有依赖库安装到 /vendor 中),但如果我知道该怎么做会更好不诉诸于此。

【问题讨论】:

    标签: ruby sinatra rack pry


    【解决方案1】:

    不确定你想做什么,但你可以

    • Monkey 修补中间件类以使用内部撬动

    • 直接从源代码连接(我理解你不想要的)

    • 使用 Sinatra 的“使用”方法从中间件堆栈中访问您想要的中间件

    这是我的想法,希望对你有帮助

    编辑后:

    查看this,可以访问@middleware 实例变量获取使用的中间件

    【讨论】:

    • 我希望能够从 Sinatra 应用程序的代码中访问已使用的实例(通过 use)。我不想修补中间件(尽管这就是我现在要做的)。我会尝试清理我的问题以使其更清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2010-10-25
    • 2016-08-25
    • 2013-06-24
    • 2020-01-14
    • 2020-06-01
    相关资源
    最近更新 更多