660 likes | 832 Views
Vandaag:. Ruby als taal Introductie “Vaardigheden”, I. Bethke Rails modellen: zoeken, bewaren Rails views: view helpers. Ruby, de taal. Webprogrammeren, week 2. Wat maakt Ruby anders?. Geïnterpreteerde taal Alles is een object Geen aparte ‘primitieve datatypen’ + is een methode
E N D
Vandaag: • Ruby als taal • Introductie “Vaardigheden”, I. Bethke • Rails modellen: zoeken, bewaren • Rails views: view helpers Wolter Kaper - w.h.kaper@uva.nl
Ruby, de taal Webprogrammeren, week 2 Wolter Kaper - w.h.kaper@uva.nl
Wat maakt Ruby anders? • Geïnterpreteerde taal • Alles is een object • Geen aparte ‘primitieve datatypen’ • + is een methode • Variabelen hebben geen type • Waarden van variabelen hebben typen • Klassen en objecten: dynamisch • methodenamen met !, ?, = erin. • functie-aanroep met of zonder () Wolter Kaper - w.h.kaper@uva.nl
Geïnterpreteerd / dynamisch • Geen aparte compilatie stap • Klasse definitie dynamisch: • Executeerbaar • Eerder bestaat klasse niet • Klasse kan gewijzigd worden: • Methoden toevoegen / weglaten: def / undef • Objecten dynamisch: • Methode toevoegen aan enkel object Wolter Kaper - w.h.kaper@uva.nl
Alles is een object • Getal als object • 1.+(1) • resultaat: 2 • + is methode van FixNum klasse • Methodeaanroep zonder () • object.methode(param1, param2) • object.methode param1, param2 • Operators: de punt . hoeft niet • 1 + 1 • Sommige klassen eigen operatoren • Vergelijken van datums, datum + getal Wolter Kaper - w.h.kaper@uva.nl
Methode-namen met !, ?, = • Mag alleen aan het eind • ! • betekent: pas op • conventie: methoden die het eigen object wijzigen • ? • conventie: methoden die een boolean teruggeven • = • setters eindigen op = • object.x = 38 (aanroep setter voor x) Wolter Kaper - w.h.kaper@uva.nl
Variabelen geen type x = 1 … x = Time.new(2009, 01, 14, 9, 30) … • Geen type-declaratie • Waarden hebben typen • “new” is een klasse-methode Wolter Kaper - w.h.kaper@uva.nl
Veel gebruikte waarde-typen • Numeric • Integer: FixNum, BigNum • Float • BigDecimal, Complex, Rational, … • String: te wijzigen, “mijntekst” • Symbol: niet te wijzigen, uniek, :mijnsymbool • Range: 25..75 Symbolen handig als hash-keys! Wolter Kaper - w.h.kaper@uva.nl
Veel gebruikte waarde-typen (2) Arrays en Hashes: • Arr = [3, 5, “jan”, Time.new(2009) ] • Ha = {“vader” => 1, :moeder => 2, :oom =>MyClass.new(5)} Een waarde selecteren: • Arr[2] • Ha[“vader”] • Ha[:oom] Wolter Kaper - w.h.kaper@uva.nl
Hashes, Arrays Wolter Kaper - w.h.kaper@uva.nl
Hashes, Arrays Wolter Kaper - w.h.kaper@uva.nl
Strings • Met enkele of dubbele aanhalinstekens • “Mijn string” • ‘Mijn string’ • Een lange string maken • ‘Bla bla bla bla bla bla bla bla ‘ ‘bla bla bla’ • Concatenatie • var = “world” • “Hello ” + var • Interpolatie • var = “world” • “Hello #{var}” Wolter Kaper - w.h.kaper@uva.nl
Controle structuren, iteratie Wolter Kaper - w.h.kaper@uva.nl
Iterators • Een aantal keren • 3.times { …} • (1..10).each { |j| ... } • for j in 1..10 …end • for obj in array …end • Itereren over array a • a.each {|val| … } • Itereren over hash h • h.each {|key, val| …} Zie… Wolter Kaper - w.h.kaper@uva.nl
if x < 10 then ... end if x < 10 then ... elsif x < 14 then ... else ... end Controle structuren: if Wolter Kaper - w.h.kaper@uva.nl
Alles is een expressie • if, while, .. geven resultaatwaarde • waarde van een blok = waarde laatste statement in blok mijnvar = if x < 10 then “een” else “piet” end mijnvar = if x < 10 then { y=6; “een” } else {“piet”; y = 7} end Wolter Kaper - w.h.kaper@uva.nl
Case mijnvar = case x when 1 ... when 2 ... else ... end Wolter Kaper - w.h.kaper@uva.nl
x = 10 while x > 0 do ... end x = 10 until x <= 0 do ... end while / until Wolter Kaper - w.h.kaper@uva.nl
Stijlvarianten • if ... then ... end • ... if ... • if x > 10 then y=3 end • y=3 if x > 10 Wolter Kaper - w.h.kaper@uva.nl
break, next, redo – in loops • break • spring uit de loop • next • spring naar einde huidige iteratie, begin met de volgende • redo • spring naar begin huidige iteratie: overnieuw Veel gebruikte stijl: • break if x > 10 Wolter Kaper - w.h.kaper@uva.nl
Raise exceptions def factorial(n) raise RuntimeError “bad argument” if n<1 ... end • raise ExceptionClassmessage • raise message • raise Wolter Kaper - w.h.kaper@uva.nl
Exception handling begin ... x = factorial(-1) rescue => exep ... puts “#{exep.class}: #{exep.message}” end • rescue => exceptievar • rescue ExcKlasse1, ExcKlasse2,... => exceptievar Wolter Kaper - w.h.kaper@uva.nl
Klassen en objecten Wolter Kaper - w.h.kaper@uva.nl
Scope van variabelen • mijnvar • Lokale scope: binnen een blok • @mijnvar • Object scope, “instance variable” • @@mijnvar • Klasse variabele • $mijnvar • Globale variabele • MijnVar • Klasse constante, moet buiten methode definitie Wolter Kaper - w.h.kaper@uva.nl
Hoe ontstaan object variabelen? class MyClass def mymethod @x = 5 end end • variabelen worden dynamisch gecreëerd Wolter Kaper - w.h.kaper@uva.nl
initialize / new class MyClass def initialize(x, y) @x, @y = x, y end end z = MyClass.new(4, “jan”) • initialize is private • argumenten van new gaan naar initialize Wolter Kaper - w.h.kaper@uva.nl
Methoden met optionele parameters Alles over optionele parameters in Ruby: http://www.skorks.com/2009/08/method-arguments-in-ruby/ Er zijn drie manieren om parameters te definieren: - def mymethod(a, b)Als je mymethod aanroept met anders dan 2 parameters is het fout. - def mymethod(a=2, b=“jan”)Als je mymethod aanroept met minder dan 2 parameters dan krijgen b en indien nodig ook a de hier opgegeven default waarde. • def mymethod(*a)Nu is het aantal parameters volledig optioneel. Alle parameters vind je in het array a. Men kan alle drie de soorten combineren… Bij (te) veel parameters: definieer een “options” hash als parameter http://jasonvogel.blogspot.com/2006/12/ruby-defaulted-optional-arguments.htmlZo krijgen de opties namen, wat de leesbaarheid vergroot. Wolter Kaper - w.h.kaper@uva.nl
accessors: getters / setters class MyClass def initialize(x, y) @x, @y = x, y end def x @x end def x=(val) @x = val end end p = MyClass.new(2,5) p.x = 27 Wolter Kaper - w.h.kaper@uva.nl
accessors: sneller (metaprogramming) class MyClass attr_reader :x, :y end • attr_reader maakt getters • attr_accessor maakt getters + setters Wolter Kaper - w.h.kaper@uva.nl
Objecten vergelijkbaar maken class Vector include Comparable attr_reader :x, :y def initialize(x, y) @x, @y = x, y end def <=>(v) return nil unless v.instance_of? Vector self.lengte <=> v.lengte end protected def lengte @x**2 + @y**2 end end Wolter Kaper - w.h.kaper@uva.nl
Private, protected, public class MyClass ...hier een of meer public methoden... protected ...hier een of meer protected methoden... private ...hier een of meer private methoden... end Wolter Kaper - w.h.kaper@uva.nl
Erfelijkheid class Vector initialize(x,y); @x, @y = x, y; end end class Vector3D < Vector initialize(x,y,z) super(x, y) @z = z end end • < in plaats van “extends” • je kunt methoden “overrulen” • met “super” kun je de overrulede-methode gebruiken Wolter Kaper - w.h.kaper@uva.nl
Modules • Een module is een stel methoden • je kunt ´m niet instantieren • het is geen klasse • include module • hiermee krijg je alle methoden van de module in je klasse • lijkt op multiple inheritance • lijkt op java interfaces • verschil: je hoeft niet te implementeren • include Enumerable, Comparable Wolter Kaper - w.h.kaper@uva.nl
class MyClass def method1 ... end end class MyClass def method2 ... end end Flexibele klassen 1 Wolter Kaper - w.h.kaper@uva.nl
class MyClass def method1 ... end end class MyClass undef method1 end Flexibele klassen 2 Wolter Kaper - w.h.kaper@uva.nl
Flexibele objecten object = MyClass.new(“Pietje”) def object.method1 ... end • object krijgt een methode erbij Wolter Kaper - w.h.kaper@uva.nl
Rails model klassen Wolter Kaper - w.h.kaper@uva.nl
Rails model klassen • Al je domein-logica • Accessors • je ziet ze niet, ze zijn er wel • afgeleid uit database tabel • per kolom een getter (zonder =) en een setter (met) • je kunt ze overrulen • Validatie • Heeft gebruiker geschikte waarden ingevoerd? • ActiveRecord: Validatie helpers Wolter Kaper - w.h.kaper@uva.nl
Validatie voorbeeld class Account < ActiveRecord::Base validates_presence_of :naam, :email, :reknum validates_numericality_of :reknum validates_uniqueness_of :email validates_format_of :email, :with=> ...regexp... validates_length_of :naam, :minimum=> 5 ... end Wolter Kaper - w.h.kaper@uva.nl
Modellen: zoeken, wijzigen, opslaan, wissen Database acties Wolter Kaper - w.h.kaper@uva.nl
Rails database acties • Waar? • Meestal in je controllers • Hoe? • Find methode van je model-objecten • Save / update methoden ,, ,, • ...hebben ze geërfd van ActiveRecord Wolter Kaper - w.h.kaper@uva.nl
Find • klanten = Klant.find(:all) • klant = Klant.find(id) • klant = Klant.find_by_naam(“Jansen”) • klanten = Klant.find_all_by_naam(“Jansen”) • klanten =Klant.find_by_naam_and_pc(“Jansen”, 12) Wolter Kaper - w.h.kaper@uva.nl
Find vervolg • klanten = Klant.find(:all, \ :conditions=> [“login=? AND password=?”, li, pw]) • :conditions => • dan een array met • Een string met de voorwaarde (SQL WHERE) • met vraagtekens waar variabelen moeten ingevuld • dan de variabelen in passende volgorde Wolter Kaper - w.h.kaper@uva.nl
Find vervolg • :order => “naam desc” • (zoals SQL ORDER BY) • :limit => 10, :offset=> 100 • aantal gevonden records beperken • offset, sla de eerste 100 over • handig als je wilt pagineren Wolter Kaper - w.h.kaper@uva.nl
Objecten opslaan • mijnobject.save • object.update_attribute(:kolomnaam, waarde) • object.update_attributes(attribuut-hash) • object = Klasse.update(id, attribuut-hash) • attribuut-hash: • :kolomnaam => waarde Wolter Kaper - w.h.kaper@uva.nl
Objecten wissen • object.destroy • Klasse.destroy(array-met-ids) Wolter Kaper - w.h.kaper@uva.nl
Rails View Helpers Wolter Kaper - w.h.kaper@uva.nl
Rails View Helpers • Een Ruby module per controller • Methoden beschikbaar in controller en in bijbehorende views • Kun je zelf schrijven • Er is een algemene “application” controller • Alle controllers erven helpers • Veel ingebouwde helpers zijn er al Wolter Kaper - w.h.kaper@uva.nl
Soorten View Helpers • head van je document • javascript_include_tag, stylesheet_link_tag, ... • gegevens weergeven • tekst uit de database • hyperlinks / actieknoppen maken • formulier maken • volautomatisch formulier • zelfvormgegeven formulier gebonden aan model • ongebonden formulierelementen • validatiefouten tonen • ajax helpers • div: class, id,... Wolter Kaper - w.h.kaper@uva.nl
Head helpers • Uit de AssetTagHelper module: • javascript_include_tag(“file1”, “file2”,...) • files bevinden zich in public/javascripts • stylesheet_link_tag(“file1”, “file2”,...) • files in public/stylesheets Wolter Kaper - w.h.kaper@uva.nl