A Rails egy igen fontos játszóteréről ejtenék pár szót, és ez nem más mint a console. Hogy mi ez, hogy indítsuk el és hasonló alapokról nem ejtenék most szót, inkább tippeket, ötleteket adnék a célból, hogy ez a hasznos eszköz megkönnyítse a dolgunkat Rails-es projektjeink esetén.
Azért azt talán fontos megjegyezni, hogy amit a console-ban teszünk azt az aktuális környezetben tesszük. (ez ugye legtöbbször a development) Ez azt jelenti hogy ha éppenséggel az adatbázisunk rekordjaival babrálunk, és módosítunk rajtuk, az bizony save esetén ténylegesen elmentődik. Hogy ezt elkerüljük, indítsuk a console-t a -s kapcsolóval (s mint sandbox).
Console-unk egyéni beállítására lehetőségünk van a home-unkban található .irbrc file szerkesztésével (windows esetén). Mivel ez a file egy ruby szkript file, így lényegében ruby kódot fogunk beleírni. Fontosabb konfigurációs lehetőségek:
#kódbehúzás
IRB.conf[:AUTO_INDENT] = true
#history elmentése
require 'irb/ext/save-history'
IRB.conf[:SAVE_HISTORY] = 100
IRB.conf[:HISTORY_FILE] = "#{ENV['HOME']}/.irb-save-history"
Bármilyen egyéb hasznos kód console-ban való újrafelhasználásához érdemes elmenteni őket az .irbrc file-ba.
Számomra hasznos segítségek
#lenti metódust meghívva kiírja a projektünkben létrehozott named route-okhoz tartozó információkat (milyen HTTP kérést "generál", milyen url mintára illeszkedik, valamint azt, hogy melyik controller melyik action-ja hívódik meg általa</pre>
def named_routes
ActionController::Routing::Routes.named_routes.each {|name, r| printf("%-40s %s\n", name, r) }; nil
end
#hasonló a fentihez, viszont itt az összes rout megtalálható és nincsenek nevesítve
def routes
puts ActionController::Routing::Routes.routes
end
#irb betöltése után fut le
IRB.conf[:IRB_RC] = Proc.new do
#lenti kód hatására a console ablakunkba kerül a log kimenete
#igen hasznos, így pl rögtön láthatjuk milyen sql futott le a háttérben
ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Base.instance_eval { alias :[] :find }
end
#prompt helyén látható az adott projekt neve
rails_root = File.basename(Dir.pwd)
IRB.conf[:PROMPT] ||= {}
IRB.conf[:PROMPT][:RAILS] = {
ROMPT_I => "#{rails_root}> ",
ROMPT_S => "#{rails_root}* ",
ROMPT_C => "#{rails_root}? ",
:RETURN => "=> %s\n"
}
IRB.conf[:PROMPT_MODE] = :RAILS
#kiírja egy objektum vagy osztály saját metódusait ha meghívjuk rajta az own_methods metódust
class Object
def own_methods
own_methods = self.methods - self.class.superclass.methods
own_methods.sort.each{|n| printf("%s\n", n)}
self.class.to_s + " object has " + own_methods.size.to_s + " methods"
end
end
#ri kimenete a konzolban lesz.
#Használata: ri 'String.reverse' vagy ha nem tudjuk melyik
#osztályban található a metódus csak simán írjuk be: ri :strftime
def ri(*names)
system(%{ri #{names.map {|name| name.to_s}.join(" ")}})
end
Egy általános, a fenti kódokat tartalmazó .irbrc megtalálható itt. Ebben látható, hogy a Rails specifikus beállítások csak akkor futnak le ha Rails console-ját indítjuk.
Egyéb trükkök a végére
Dupla tab billentyű leütésével lehetőségünk van metódusokat/osztályokat kiegészíteni. Olyan mint a shell-ben a mappa és file kiegészítés tabra.
Törlés: clear vagy ctrl+shift+l
Console-unkban használhatjuk az app változót. Ez az ApplicationController::Integration::Session-nak felel meg.
Ilyeneket csinálhatunk vele:
>> app.get ‘/hello/world’
=> 200
>> app.response.headers
=> {”Status”=>”200 OK”, “type”=>”text/html; charset=utf-8″,
“cookie”=>[], “Cache-Control”=>”no-cache”,
“Content-Length”=>13}
>> app.response.body
=> “Hello, world!”
>> app.person_path(1)
=> “/people/1″
>> app.person_path(:id => 1)
=> “/people/1″
>> app.person_path(:id => 1, :section => ‘enrollment’)
=> “/people/1?section=enrollment”
>> app.formatted_person_path(1, :js)
=> “/people/1.js”
>> app.formatted_person_path(1,
ml)
=> “/people/1.xml”
>> app.formatted_people_path(:rss)
=> “/people.rss”
>> app.search_people_path(:query => ‘Brian’)
=> “/people/search?query=Brian”
>> app.get app.search_people_path(:query => ‘Brian’)
=> 200
>> app.request.request_uri
=> “/people/search?query=Brian”
>> app.request.params
=> {”query”=>["Brian"]}
>> app.post ‘/account/login’, { :username => ‘defunkt’, :password => ‘razzletaz’ }
=> 200
>> app.cookies
=> {”_session_id”=>”9d1c014f42881524ff6cb81fb5b594bc”}
Igen hasznos tud lenni y (mint to_yaml) parancs.
y User.find(1) == puts User.find(1).to_yaml
Létrehozhatunk új session-öket az irb parancsal. Ha azt akarjuk hogy pl a User modell scope-ját használjuk az új session-ben: irb User
Ezután a find(1) automatikusan a User modell find metódusát indítja el.
Session-ök listája: jobs
Session-ök közti váltás: fg 0, fg 1, stb
A kedvenc trükköm pedig így a végén, a projekt specifikus beállítások. Nemrég ismerkedtem meg a REXML-el. Namost ahhoz, hogy eljussak pl egy adott xml node kereséséhez ezen a procedurán kellett mindig végigmennem:
require 'rexml/document' u=User.find(1) xml=REXML::Document.new u.folder_tree node=REXML::XPath.first(xml, "//*[@id=1]")
Ahelyett hogy ezt mindig begépeljem, más projektnél meg esetleg más kezdő parancsokat, a következőt csináltam az .irbrc file-ba:
IRB.conf[:IRB_RC] = Proc.new do case File.basename(Dir.pwd) when "projekt_neve" require 'rexml/document' @u=User.find(1) @xml=REXML::Document.new @u.folder_tree @node=REXML::XPath.first(@xml, "//*[@id=1]") when "projekt_neve2" end end