úterý 25. září 2007

Ruby a Rails konzole

Dnes pár triků pro práci s irb a Rails konzolí. Pozor: práce s Ruby konzolemi je návyková. Já 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 a grep:

    find . -name \*rb

    irb(main):001:0> require 'find'
    => true
    irb(main):002:0> Find.find('.') {|f| puts f if f =~ /.*\.rb$/}

    find . -name \*rb | xargs grep 'neco'

    irb(main):003:0> Find.find('.') {|f| puts f if File.file?(f) and IO.read(f) =~ /neco/}

  • náhrada za awk + sed
  • kalkulačka :-)
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

Žádné komentáře: