Další věcí kterou se naučíme je jak vytvářet komponenty a jak je skládat. Například si vytvoříme komponentu pro přihlašování která pak může být součástí libovolné stránky. Všechno kolem přihlašování je zapouzdřeno do komponenty a tu pak jen používáme aniž bychom se museli o něco starat.
Princip komponenty je zapouzdření funkčnosti do samostatného objektu.
Příklad 51.23. Ukázka komponenty
1 class LoginComponent < Page 2 def initialize 3 @username = nil 4 end 5 def login(user, pass) 6 authorized = authentication(user, pass) 7 @username = user if authorized 8 authorized 9 end 10 def authentication(user, pass) 11 user == pass 12 end 13 def render_on(r) 14 name = pass = nil 15 r.form do 16 r.print "Name:" 17 r.text_input(''){|name|} 18 r.print "Password:" 19 r.password_input(''){|pass|} 20 r.submit({'value'=>'Login'}){login(name, pass)} 21 end 22 end 23 end
Použití komponenty ve stránce pak vypadá asi takto
První pokus o komponentu je návrh přihlašovací komponenty do hlavní stránky.
1 #!/usr/bin/env ruby 2 # $Id: login3.rb,v 1.1 2003/12/08 18:40:07 radek Exp $ 3 # $Source: /home/radek/cvs/ruby-book/example/net/web/borges02/login3.rb,v $ 4 # Component example 5 # Copyright (c) 2003 Radek Hnilica 6 require 'borges' 7 require 'borges/Page' 8 9 include Borges 10 11 # Component class. In real word it will be probably in separated file. 12 class LoginComponent < Page 13 def initialize 14 @username = nil 15 end 16 def login(username, password) 17 # Use user authorization code for login in 18 # This is simple fake code. 19 if username == 'radek' and password == 'pass' then 20 puts "#{username}> P�ihl�enn� bylo �sp�n�." 21 @username = username 22 else 23 puts "#{username}> ERR: Bad password given!" 24 @username = nil 25 end 26 end 27 def render_on(r) 28 username = password = nil # Declaring local variables. 29 r.form do 30 r.table({'frame'=>'border', 'align'=>'center', 'bgcolor'=>'#e0e8ff'}) do 31 r.tr do 32 r.td({'colspan'=>'2', 'align'=>'center', 'bgcolor'=>'#d0c0e0'}){ 33 r.print "<b>Pros�m, p�ihlaste se:</b>"} 34 end 35 r.tr do 36 r.td{r.print "Jm�no:"} 37 r.td{r.text_input(""){|username|}} 38 end 39 r.tr do 40 r.td{r.print "Heslo:"} 41 r.td{r.password_input(""){|n| password = n;}} 42 end 43 r.tr do 44 r.td({'colspan'=>'2', 'align'=>'center'}){ 45 r.submit({'value'=>'P�ihl�sit'}){ 46 login(username, password)}} 47 end 48 end 49 end 50 end 51 end 52 53 class Login < Page 54 attr_reader :username 55 56 def initialize() 57 @login = LoginComponent.new 58 @title = "Hlavn� str�nka s p�ihla�ovac� komponentou" 59 end 60 61 def render_on(r) 62 r.tag('html') do 63 # html/head just to be correct especially with charset. 64 r.tag('head') do 65 r.print "<title>P�ihla�ovac� dialog varianta 2</title>" 66 r.print %q{<meta http-equiv="Content-Type" } 67 r.print %Q{content="text/html; charset=iso-8859-2">\n} 68 end 69 r.tag('body') do 70 # Page main table construction 71 r.table({'rules'=>'all', 'frame'=>'border'}) do 72 r.tr do 73 r.td{r.print "LOGO"} 74 r.td{r.heading @title} 75 r.td do 76 # use the login component 77 @login.render_on(r) 78 end 79 end 80 r.tr do 81 r.td({'rowspan'=>'2'}){r.print "Left<br>Side<br>Menu"} 82 r.td{r.print "<a href="">Restart</a> <a>Nothing</a>"} 83 r.td({'rowspan'=>'2'}){r.print "Right<br>Side<br>Column"} 84 end 85 r.tr do 86 #Left Side Menu spans here 87 r.td{r.print "CONTENTS"} 88 #Right Side Colume spans here 89 end 90 r.tr do 91 r.td({'colspan'=>'3'}){r.print "BOTTOM"} 92 end 93 end 94 end 95 end 96 end 97 end 98 99 Borges::register_application("login-three", Login) 100 101 if $0 == __FILE__ then 102 require 'borges/Webrick' 103 Borges::WebrickConnection.start({:Port=>7000}) 104 end 105 #Keep this comment at the end of the file 106 #Local variables: 107 #indent-tabs-mode: nil 108 #End: 109