2009-01-29 16 views
20

In PHP können Sie tun:Entspricht PHPs print_r in Ruby/Rails?

print_r($var) oder vardump($var)

, die "Mensch-readible" Informationen über Variable druckt.

Gibt es äquivalente Funktionen/Helfer für die in Ruby/Rails?

Antwort

33

In Rails-Vorlagen Sie

<%= debug an_object %> 

tun können und es wird nette HTML PRE Ausgabe machen.

+0

ist es in View-Datei oder Controller? – Harman

15

Versuchen pp mit Sie müssen es in Skripten erfordern (oder in irb, wenn Ihr .irbc dies nicht bereits tun).

require 'pp' 

Dann können Sie ‚Schöndruck‘ ein Objekt so:

pp object 
6

Es gibt die Methode inspect, die hilft. Manchmal hilft das Aufrufen der to_s-Methode für ein Objekt (to_s gibt eine Zeichenfolgendarstellung des Objekts zurück). Sie können auch methods, local_variables, class_variables, instance_variables, constants und global_variables abfragen.

p ['Hello',"G'day",'Bonjour','Hola'].inspect 
# >> "[\"Hello\", \"G'day\", \"Bonjour\", \"Hola\"]" 

p ['Hello',"G'day",'Bonjour','Hola'].to_s 
# >> "HelloG'dayBonjourHola" 

p Array.new.methods 
# >> ["select", "[]=", "inspect", "compact"...] 

monkey = 'baboon' 
p local_variables 
# >> ["monkey"] 

class Something 
    def initialize 
    @x, @y = 'foo', 'bar' 
    @@class_variable = 'gorilla' 
    end 
end 

p Something.class_variables 
# >> ["@@class_variable"] 

s = Something.new 
p s.instance_variables 
# >> ["@x", "@y"] 

p IO.constants 
# >> ["TRUNC", "SEEK_END", "LOCK_SH"...] 

p global_variables 
# >> ["$-d", "$\"", "$$", "$<", "$_", "$-K"...] 
10

Statt erfordern 'pp' und pp verwenden, können Sie einfach tun

p object 

Getestet Beispiel

require 'pp' 

class A 
    def initialize 
    @a = 'somevar' 
    @b = [1,2,3] 
    @c = {'var' => 'val'} 
    end 
end 

a = A.new 
pp a # Gives -> #<A:0x2c6d048 @a="somevar", @b=[1, 2, 3], @c={"var"=>"val"}> 
p a # Gives -> #<A:0x2c6d048 @a="somevar", @b=[1, 2, 3], @c={"var"=>"val"}>. No need to require 'pp' 
2

Überprüfen Sie die Anleitung für das Debuggen Schienen aus: http://guides.rubyonrails.com/debugging_rails_applications.html

Hinweise: script/console ist großes Material im Zusammenhang mit Ihrer App script/server, um zu versuchen --debugger den Server mit einem Debugger zu starten gedreht auf, können Sie dann 'Debug' in Ihrem Code verwenden, um in eine interaktive Shell zu brechen

0

Raten Sie, ich bin ein wenig zu spät, aber was ist mit logger.info [debug | warning]? Verwenden Sie dies von Controllern und Modellen. Es wird in Ihren Protokolldateien angezeigt (development.log im Modus "dev"). und die oben erwähnten für Ansichten.

Dies sind keine genauen Antworten auf Ihre Fragen, aber Sie können auch mit script/console Ihre Rails-App in eine interaktive Sitzung laden.

Schließlich können Sie Debugger in eine Zeile Ihrer Rails-Anwendung platzieren und der Browser wird "hängen", wenn Ihre App diese Zeile ausführt und Sie in einer Debug-Sitzung von der genauen Zeile Ihres Debuggers platziert werden können im Quellcode.

+0

Ich habe diesen Code in Controller geschrieben ---- Def-Index @users = User.all Ende --- jetzt ich Array drucken möchte ich dies anwenden <% = debuggen (@users)%> aber nicht funktioniert :( – Harman

1

Ein Ansatz, den ich auf eine Menge anlehnen, ist dies:

logger.debug "OBJECT: #{an_object.to_yaml}" 

Leicht zu lesen, obwohl es ein wenig unhandlich für große Objekte zu bekommen.

5

Ich weiß, dies ist ein alter Post, aber es ist das erste, was Google erscheint bei der Suche nach "Ruby Äquivalent von PHP print_r". Ich verwende Ruby im Befehlszeilenmodus, und es gibt wirklich kein sehr gutes Äquivalent. "pp" ist in Ordnung für ziemlich einfache Strukturen, aber sobald Sie Hashes in Arrays in Hashes in mehreren Arrays verschachteln, wird es ziemlich schnell zu einem Durcheinander. Da ich keine gute Emulation von print_r gefunden habe, habe ich selbst eine geschrieben. Es ist gut genug für meine Zwecke, nicht übermäßig kompliziert und ich dachte, ich würde es teilen, um anderen Leuten Kopfschmerzen zu ersparen. Vergleichen Sie die Ausgabe mit dem real PHP print_r

def print_r(inHash, *indent) 
    @indent = indent.join 
    if (inHash.class.to_s == "Hash") then 
     print "Hash\n#{@indent}(\n" 
     inHash.each { |key, value| 
      if (value.class.to_s =~ /Hash/) || (value.class.to_s =~ /Array/) then 
       print "#{@indent} [#{key}] => " 
       self.print_r(value, "#{@indent}  ") 
      else 
       puts "#{@indent} [#{key}] => #{value}" 
      end 
     } 
     puts "#{@indent})\n" 
    elsif (inHash.class.to_s == "Array") then 
     print "Array\n#{@indent}(\n" 
     inHash.each_with_index { |value,index| 
      if (value.class.to_s == "Hash") || (value.class.to_s == "Array") then 
       print "#{@indent} [#{index}] => " 
       self.print_r(value, "#{@indent}  ") 
      else 
       puts "#{@indent} [#{index}] => #{value}" 
      end 
     } 
     puts "#{@indent})\n" 
    end 
    # Pop last indent off 
    8.times {@indent.chop!} 
end 

Hier ist ein Beispiel (aus chaotisch absichtlich zu zeigen, warum die PHP print_r so schön ist):

carTools = [ "Socket Set", "Combination Wrenches", "Oil Filter puller", "Brake Compressor" ] 
    houseTools =[ "Circular Saw", "Miter Saw", "Drill" ] 
    garageItems = Hash["Car1" => "Ford Mustang", "Car2" => "Honda Civic", "Bike1" => "IronHorse"] 
    garageItems["Tools"] = Hash["Car Tools" => carTools, "House Tools" => houseTools] 
    constructionSupplies = Hash["Plywood" => ["3/4\" T&G Plywood Sheets", "1/2\" Plywood Sheets"], 
           "Boards" => ["2x4s", "2x6s", "Engineered I-Joists"], 
           "Drywall" => ["4x8 1/2\" Sheetrock", "Mesh tape", "Paper tape", "Joint compount"]] 
    carParts = Hash["Mustang" => ["Clutch", "Transmission", "3.55 Ring & Pinion Gears", "Differential", "30# Injectors", "Pro-M 77mm MAF"]] 
    garageItems["Supplies"] = ["Oil", "WD40", constructionSupplies, carParts, "Brake Fluid"] 
    print_r(garageItems) 

Ausgabe von print_r (eigentlich verständlich von einem Menschen):

Hash 
    (
     [Car1] => Ford Mustang 
     [Car2] => Honda Civic 
     [Bike1] => IronHorse 
     [Tools] => Hash 
      (
       [Car Tools] => Array 
        (
         [0] => Socket Set 
         [1] => Combination Wrenches 
         [2] => Oil Filter puller 
         [3] => Brake Compressor 
        ) 
       [House Tools] => Array 
        (
         [0] => Circular Saw 
         [1] => Miter Saw 
         [2] => Drill 
        ) 
      ) 
     [Supplies] => Array 
      (
       [0] => Oil 
       [1] => WD40 
       [2] => Hash 
        (
         [Plywood] => Array 
          (
           [0] => 3/4" T&G Plywood Sheets 
           [1] => 1/2" Plywood Sheets 
          ) 
         [Boards] => Array 
          (
           [0] => 2x4s 
           [1] => 2x6s 
           [2] => Engineered I-Joists 
          ) 
         [Drywall] => Array 
          (
           [0] => 4x8 1/2" Sheetrock 
           [1] => Mesh tape 
           [2] => Paper tape 
           [3] => Joint compount 
          ) 
        ) 
       [3] => Hash 
        (
         [Mustang] => Array 
          (
           [0] => Clutch 
           [1] => Transmission 
           [2] => 3.55 Ring & Pinion Gears 
           [3] => Differential 
           [4] => 30# Injectors 
           [5] => Pro-M 77mm MAF 
          ) 
        ) 
       [4] => Brake Fluid 
      ) 
    )