1 / 66

Vandaag:

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

sian
Download Presentation

Vandaag:

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Vandaag: • Ruby als taal • Introductie “Vaardigheden”, I. Bethke • Rails modellen: zoeken, bewaren • Rails views: view helpers Wolter Kaper - w.h.kaper@uva.nl

  2. Ruby, de taal Webprogrammeren, week 2 Wolter Kaper - w.h.kaper@uva.nl

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. Hashes, Arrays Wolter Kaper - w.h.kaper@uva.nl

  11. Hashes, Arrays Wolter Kaper - w.h.kaper@uva.nl

  12. 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

  13. Controle structuren, iteratie Wolter Kaper - w.h.kaper@uva.nl

  14. 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

  15. 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

  16. 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

  17. Case mijnvar = case x when 1 ... when 2 ... else ... end Wolter Kaper - w.h.kaper@uva.nl

  18. x = 10 while x > 0 do ... end x = 10 until x <= 0 do ... end while / until Wolter Kaper - w.h.kaper@uva.nl

  19. Stijlvarianten • if ... then ... end • ... if ... • if x > 10 then y=3 end • y=3 if x > 10 Wolter Kaper - w.h.kaper@uva.nl

  20. 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

  21. 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

  22. 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

  23. Klassen en objecten Wolter Kaper - w.h.kaper@uva.nl

  24. 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

  25. Hoe ontstaan object variabelen? class MyClass def mymethod @x = 5 end end • variabelen worden dynamisch gecreëerd Wolter Kaper - w.h.kaper@uva.nl

  26. 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

  27. 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

  28. 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

  29. 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

  30. 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

  31. 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

  32. 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

  33. 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

  34. class MyClass def method1 ... end end class MyClass def method2 ... end end Flexibele klassen 1 Wolter Kaper - w.h.kaper@uva.nl

  35. class MyClass def method1 ... end end class MyClass undef method1 end Flexibele klassen 2 Wolter Kaper - w.h.kaper@uva.nl

  36. Flexibele objecten object = MyClass.new(“Pietje”) def object.method1 ... end • object krijgt een methode erbij Wolter Kaper - w.h.kaper@uva.nl

  37. Rails model klassen Wolter Kaper - w.h.kaper@uva.nl

  38. 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

  39. 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

  40. Modellen: zoeken, wijzigen, opslaan, wissen Database acties Wolter Kaper - w.h.kaper@uva.nl

  41. 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

  42. 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

  43. 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

  44. 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

  45. 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

  46. Objecten wissen • object.destroy • Klasse.destroy(array-met-ids) Wolter Kaper - w.h.kaper@uva.nl

  47. Rails View Helpers Wolter Kaper - w.h.kaper@uva.nl

  48. 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

  49. 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

  50. 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

More Related