Ruby konzole a Rails konzole
Dnes pár triků pro práci s irb (Interactive Ruby) a Rails konzolí. Pozor: práce s Ruby konzolemi je návyková.
Osobně používám konzole hlavně v následujících scénářích:
- Elaborace jazykových a datových konstrukcí (to je vhodné zájmena u modelů z RoR, např. pokud ladíte komplikovaný SQL dotaz).
- Zkoumání vlastností tříd a objektů:
irb(main):008:0> [1].methods.select {|m| m =~ /^s/} - Náhrada za Unix-like find, xargs, grep, awk, sed.
- Kalkulačka
Příklady užití unixových nástrojů
- find . -name \*rb (vyhledání všech souborů a adresářů se jménem končícím na ‘rb’)
irb(main):001:0> require 'find'
=> true
irb(main):002:0> Find.find('.') {|f| puts f if f =~ /.*\.rb$/}
- find . -type f | xargs grep ‘neco’ (vyhledání všech souborů obsahujících text ‘neco’)
irb(main):003:0> Find.find('.') {|f| puts f if File.file?(f) and IO.read(f) =~ /neco/} - awk ‘{ if (NR==1) {sum=$1} else {sum+=$1} }END{ print sum }’ /tmp/numbers (suma všech čísel v prvním sloupci textového souboru)
irb(main):004:0> s = 0; File.open('/tmp/numbers').each {|l| s = s + l.split(' ')[0].to_i}; puts s
Typy pro použití konzolí
To, co platí pro irb, platí i pro Rails konzoli, ne však naopak.
irb
- Přístup na poslední návratovou hodnotu. Konzole poskytuje proměnou ‘_’, která vrací návratovou hodnotu posledního úspěšně provedeného příkazu.
irb(main):001:0> 1 + 1
=> 2
irb(main):002:0> _
=> 2
- Uchování historie příkazů mezi spuštěními konzole. Napsali jste komplikovaný finder na modelu RoR a zjistili, že musíte zrestartovat konzoli, aby se vám nahrály změny provedené v kódu (viz níže). Zde je řešení. Přidejte do ~/.irbrc následující:
require ‘irb/completion’
require ‘irb/ext/save-history’
ARGV.concat [ “–readline”, “–prompt-mode”, “simple” ]
IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = “#{ENV[’HOME’]}/.irb-save-history”
Rails konzole
- Reloading. Konzole načítá soubory zdrojových kódu vaší aplikace při jejím startu. Aby nebylo nutné restartovat konzoli po každé úpravě kódu, existuje příkaz reload!, který zdrojové kódy nahraje znovu. Bohužel, výše uvedené neplatí pro kódy z adresářů lib nebo vendor.
- Polidštěná vizualizace objektů. RoR rozšiřují třídu Object o metodu to_yaml, která převadí instanci třídy do formátu YAML. Dokonce existuje funkce ‘y’, která na svém parametru metodu to_yaml vyvolá.
>> l = Login.find 1
=> #"2999-12-18 00:00:00", "nick"=>"max", "id"=>"1", "subject_id"=>"1", "password"=>"5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8"}>
>> puts l.to_yaml
--- !ruby/object:Login
attributes:
expiration_date: 2999-12-18 00:00:00
nick: max
id: "1"
subject_id: "1"
password: 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
=> nil
>> y l
--- !ruby/object:Login
attributes:
expiration_date: 2999-12-18 00:00:00
nick: max
id: "1"
subject_id: "1"
password: 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
=> nil


Komentář od filemon
Datum: 5. 1. 2008, 16:25
Musim rict, ze me nahrazka za unix prikazovou radku opravdu prekvapila.
Jednak by mi asi chybelo doplnovani v cestach a pak taky vykonnostne to neni zadna slava. Treba u toho findu je ruby 3x pomalejsi.;)