2012-11-08 6 views
1

Je suis nouveau à l'utilisation de Pry, et essayer comme je pourrais, je ne peux pas trouver les bonnes commandes pour accéder à une instance middleware rack qui est en cours d'exécution avec une application Sinatra. J'ai mis binding.pry dans la partie de l'application où j'ai une erreur, mais le problème est avec un assistant qui ne renvoie aucun résultat, et il obtient les résultats de l'info mis dans l'env par le middleware. J'ai essayé de cd`ing dans Rack :: GeoIPCity, mais cela ne m'a pas permis d'accéder aux informations sur les instances.Comment utiliser pry pour accéder à une instance middleware Rack?

Donc, je peux vérifier les gens du pays, l'aide et l'env - comment puis-je au middlewaredu code de l'application Sinatra?

par exemple.

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 

donc au point où binding.pry est appelé je peux facilement accéder geo, env (qui est une aide fournie par Sinatra en rack de env), et je pourrais facilement ajouter une liaison à l'intérieur du geo_city_info si je voulais. Mais, je ne peux pas accéder au Rack :: GeoIPCity à partir de ces liaisons. J'espère qu'il y a une commande qui pourrait m'aider à y accéder, car elle doit faire partie du code de l'application chargée.

Bien sûr, je peux ouvrir les fichiers de code pour le middleware et mettre la reliure (comme j'installe toutes les bibliothèques dépendantes dans/vendor en utilisant Bundler), mais ce serait beaucoup mieux si je savais comment faire ceci sans recourir à cela.

Toute aide ou compréhension est très appréciée.

Répondre

2

Je ne sais pas ce que vous essayez de faire, mais vous pouvez

  • Singe patcher la classe middleware à utiliser levier à l'intérieur

  • connecter directement à partir du code source (ce que je comprends que vous ne voulez pas)

  • jeu autour de la méthode « utilisation » de Sinatra pour accéder au middleware que vous voulez de la pile middleware

Ce sont mes idées, espère que cela aide

APRÈS ÉDITÉ:

Découvrez this, vous pouvez accéder à la variable d'instance @middleware pour obtenir les intergiciels utilisés

+0

Je voudrais être capable d'accéder à l'instance qui a été utilisée (via 'use') depuis le code de l'application Sinatra. Je ne veux pas corriger le middleware (bien que ce soit ce que je ferai pour l'instant). Je vais essayer de nettoyer ma question pour la rendre plus claire. – iain

+0

Excellent, bien repéré! – iain

Questions connexes