De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Vandaag: Ruby als taal Introductie “Vaardigheden”, I. Bethke Rails modellen: zoeken, bewaren Rails views: view helpers 13-1-2010Wolter Kaper -

Verwante presentaties


Presentatie over: "Vandaag: Ruby als taal Introductie “Vaardigheden”, I. Bethke Rails modellen: zoeken, bewaren Rails views: view helpers 13-1-2010Wolter Kaper -"— Transcript van de presentatie:

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

2 13-1-2010Wolter Kaper - w.h.kaper@uva.nl2 Ruby, de taal Webprogrammeren, week 2

3 13-1-2010Wolter Kaper - w.h.kaper@uva.nl3 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 ()

4 13-1-2010Wolter Kaper - w.h.kaper@uva.nl4 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

5 13-1-2010Wolter Kaper - w.h.kaper@uva.nl5 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

6 13-1-2010Wolter Kaper - w.h.kaper@uva.nl6 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)

7 13-1-2010Wolter Kaper - w.h.kaper@uva.nl7 Variabelen geen type x = 1 … x = Time.new(2009, 01, 14, 9, 30) … Geen type-declaratie Waarden hebben typen “new” is een klasse-methode

8 13-1-2010Wolter Kaper - w.h.kaper@uva.nl8 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!

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] 13-1-2010Wolter Kaper - w.h.kaper@uva.nl9

10 Hashes, Arrays 13-1-2010Wolter Kaper - w.h.kaper@uva.nl10

11 Hashes, Arrays 13-1-2010Wolter Kaper - w.h.kaper@uva.nl11

12 13-1-2010Wolter Kaper - w.h.kaper@uva.nl12 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}”

13 13-1-2010Wolter Kaper - w.h.kaper@uva.nl13 Controle structuren, iteratie

14 13-1-2010Wolter Kaper - w.h.kaper@uva.nl14 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…

15 13-1-2010Wolter Kaper - w.h.kaper@uva.nl15 Controle structuren: if if x < 10 then... end if x < 10 then... elsif x < 14 then... else... end

16 13-1-2010Wolter Kaper - w.h.kaper@uva.nl16 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

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

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

19 13-1-2010Wolter Kaper - w.h.kaper@uva.nl19 Stijlvarianten if... then... end... if... if x > 10 then y=3 end y=3 if x > 10

20 13-1-2010Wolter Kaper - w.h.kaper@uva.nl20 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

21 13-1-2010Wolter Kaper - w.h.kaper@uva.nl21 Raise exceptions def factorial(n) raise RuntimeError “bad argument” if n<1... end raise ExceptionClass message raise message raise

22 13-1-2010Wolter Kaper - w.h.kaper@uva.nl22 Exception handling begin... x = factorial(-1) rescue => exep... puts “#{exep.class}: #{exep.message}” end rescue => exceptievar rescue ExcKlasse1, ExcKlasse2,... => exceptievar

23 13-1-2010Wolter Kaper - w.h.kaper@uva.nl23 Klassen en objecten

24 13-1-2010Wolter Kaper - w.h.kaper@uva.nl24 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

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

26 13-1-2010Wolter Kaper - w.h.kaper@uva.nl26 initialize / new class MyClass def initialize(x, y) @x, @y = x, y end z = MyClass.new(4, “jan”) initialize is private argumenten van new gaan naar initialize

27 13-1-2010Wolter Kaper - w.h.kaper@uva.nl27 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.html http://jasonvogel.blogspot.com/2006/12/ruby-defaulted-optional-arguments.html Zo krijgen de opties namen, wat de leesbaarheid vergroot.

28 13-1-2010Wolter Kaper - w.h.kaper@uva.nl28 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

29 13-1-2010Wolter Kaper - w.h.kaper@uva.nl29 accessors: sneller (metaprogramming) class MyClass attr_reader :x, :y end attr_reader maakt getters attr_accessor maakt getters + setters

30 13-1-2010Wolter Kaper - w.h.kaper@uva.nl30 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

31 13-1-2010Wolter Kaper - w.h.kaper@uva.nl31 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

32 13-1-2010Wolter Kaper - w.h.kaper@uva.nl32 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 < in plaats van “extends” je kunt methoden “overrulen” met “super” kun je de overrulede-methode gebruiken

33 13-1-2010Wolter Kaper - w.h.kaper@uva.nl33 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

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

35 13-1-2010Wolter Kaper - w.h.kaper@uva.nl35 Flexibele klassen 2 class MyClass def method1... end class MyClass undef method1 end

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

37 13-1-2010Wolter Kaper - w.h.kaper@uva.nl37 Rails model klassen

38 13-1-2010Wolter Kaper - w.h.kaper@uva.nl38 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

39 13-1-2010Wolter Kaper - w.h.kaper@uva.nl39 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

40 13-1-2010Wolter Kaper - w.h.kaper@uva.nl40 Modellen: zoeken, wijzigen, opslaan, wissen Database acties

41 13-1-2010Wolter Kaper - w.h.kaper@uva.nl41 Rails database acties Waar?  Meestal in je controllers Hoe?  Find methode van je model-objecten  Save / update methoden,,,, ...hebben ze geërfd van ActiveRecord

42 13-1-2010Wolter Kaper - w.h.kaper@uva.nl42 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)

43 13-1-2010Wolter Kaper - w.h.kaper@uva.nl43 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

44 13-1-2010Wolter Kaper - w.h.kaper@uva.nl44 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

45 13-1-2010Wolter Kaper - w.h.kaper@uva.nl45 Objecten opslaan mijnobject.save object.update_attribute(:kolomnaam, waarde) object.update_attributes(attribuut-hash) object = Klasse.update(id, attribuut-hash) attribuut-hash: :kolomnaam => waarde

46 13-1-2010Wolter Kaper - w.h.kaper@uva.nl46 Objecten wissen object.destroy Klasse.destroy(array-met-ids)

47 13-1-2010Wolter Kaper - w.h.kaper@uva.nl47 Rails View Helpers

48 13-1-2010Wolter Kaper - w.h.kaper@uva.nl48 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

49 13-1-2010Wolter Kaper - w.h.kaper@uva.nl49 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,...

50 13-1-2010Wolter Kaper - w.h.kaper@uva.nl50 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

51 Head helpers 13-1-2010Wolter Kaper - w.h.kaper@uva.nl51

52 13-1-2010Wolter Kaper - w.h.kaper@uva.nl52 Gegevens op de pagina zetten Uit de TextHelper module: h(user_text) standaard gebruiken!? sanitize(user_html) strip_tags(user_text) markdown(user_text) BlueCloth gem nodig __X__ => X textilize(user_text) RedCloth gem nodig *X* => X http://hobix.com/textile/ truncate(text, length, “...”) te lange tekst afbreken

53 13-1-2010Wolter Kaper - w.h.kaper@uva.nl53 Hyperlinks genereren url_for(url) button_to( name, url, {html-options})  button_to(“delete image”, { :action=>”delete”, :id=>@image.id }, :confirm=>”Are you sure?” link_to( name, url, {html-options})

54 URL’s genereren link_to(name, url, {html-options}) link_to(“edit post”, { :controller=>…, :action=>…, :id=>…}, …) link_to(“edit post”, urlhelper(id), …)  Link_to(“edit post”, edit_post_path(@post), …) 13-1-2010Wolter Kaper - w.h.kaper@uva.nl54

55 13-1-2010Wolter Kaper - w.h.kaper@uva.nl55 Formulier maken: gebonden aan model FormHelper module, voorbeeldje: {:action => “create”} do |form| %>

56 13-1-2010Wolter Kaper - w.h.kaper@uva.nl56 Selectbox in formulier FormOptionsHelper module: select(object, attribuut, keuzen, {options}, {html-options}) select(“post”, “person_id”, \ Person.find(:all).collect {|p| [p.name, p.id]}, \ { :include_blank=>true }) options_for_select(container, selected) als je zelf de tag neerzet of als je select_tag helper gebruikt... (zie verder)

57 13-1-2010Wolter Kaper - w.h.kaper@uva.nl57 Ongebonden formulier FormTagHelper module:...

58 13-1-2010Wolter Kaper - w.h.kaper@uva.nl58 Ongebonden formulierelementen FormTagHelper module: check_box_tag(...) file_field_tag(...) hidden_field_tag(...) image_submit_tag(...) password_field_tag(...) select_tag(...)...

59 13-1-2010Wolter Kaper - w.h.kaper@uva.nl59 Validatiefouten tonen ActiveRecordHelper module: error_messages_for(...)  alle foutmeldingen bij elkaar boven- of onderaan je formulier, in Rails layout. error_messages_on( object, accessor, prepend_text=“”, append_text=“”, css_class = “formError” ) 

60 21-1-2009Wolter Kaper - w.h.kaper@uva.nl60 Routes.rb, URLs, URL-helpers

61 21-1-2009Wolter Kaper - w.h.kaper@uva.nl61 Routes in routes.rb map.connect ':controller/:action/:id' 3 receptors:  :controller  :action  :id map.connect '/groente/:action/:id' :controller => 'vegetables'  1 statisch onderdeel: 'groente'

62 21-1-2009Wolter Kaper - w.h.kaper@uva.nl62 Benoemde routes map.groente '/groente/:action/:id' :controller => 'vegetables' URL helper functies: groente_url(id)  complete url groente_path(id)  zonder http:// en hostnaam

63 21-1-2009Wolter Kaper - w.h.kaper@uva.nl63 Routes volgens REST map.resources :groente maakt in 1x vier benoemde routes: map.groentes '/groentes :controller => 'groentes' map.groente '/groente/:id :controller => 'groentes' map.edit_groente '/groente/:id/edit :controller => 'groentes' map.new_groente '/groente/:id/new :controller => 'groentes' krijg je als je ´n scaffold doet helpers: groentes_path, groente_path(id), new_groente_path, edit_groente_path(id)

64 21-1-2009Wolter Kaper - w.h.kaper@uva.nl64 Routes naar genest resource map.resources :groente, \ :has_many=> :varieties benoemde routes: '/groente/:groente_id/varieties '/groente/:groente_id/variety/:id '/groente/:groente_id/variety/:id/edit '/groente/:groente_id/variety/:id/new URL helpers, a la: groente_varieties_path(groente_id) groente_variety_path(groente_id, id)

65 21-1-2009Wolter Kaper - w.h.kaper@uva.nl65 REST routes en controller acties \ HTTP werkwoord URL + Helper GETPOSTPUTDELETE /taaks/1 taak_path(@taak) showupdatedestroy /taaks taaks_path indexcreate /taaks/1/edit edit_taak_path(@taak) edit /taaks/new new_taak_path new

66 13-1-2010Wolter Kaper - w.h.kaper@uva.nl66 Doelen voor vrijdagmiddag Statische pagina’s af Vormgegeven met stylesheets Vormgeving toegepast op views Beginnen met Ruby programmeren  Paar simpele controllers doen alles al goed  Validatie is toegevoegd  Domeinlogica schrijven, beginnen met…


Download ppt "Vandaag: Ruby als taal Introductie “Vaardigheden”, I. Bethke Rails modellen: zoeken, bewaren Rails views: view helpers 13-1-2010Wolter Kaper -"

Verwante presentaties


Ads door Google