51.5.3. Komponenty

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            1
 12     end
 13     def render_on(r)
 14         name = pass = nil       2
 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
2

Zde jsou vytvořeny lokální proměnné. Tento postup je nezbytný, neboť hodnotu těchto proměnných měním ve vnořených blocích. Pokud bych zdě proměnné takto nedefinoval, v daných blocích by vznikly a současně s jejich opuštěním zanikly.

1

Zástupný autentikační kód. V reálné aplikaci je na tomto místě skutečné ověření pravosti hesla v databázi, ldapu či jiným odpovídajícím bezpečným způsobem.


Použití komponenty ve stránce pak vypadá asi takto

Příklad 51.24. Použití dříve vytvořené komponenty

  1 class Main < Page
  2     def initialize()
  3         @login = LoginComponent.new     1
  4     end
  5     def render_on(r)
  6         ...
  7         @login.render_on(r)     2
  8         ...
  9     end
 10 end
1

Vytvoření komponenty při inicializaci objektu.

2

Použití vytvořené komponenty. Na tomto místě se zobrazí (generuje její obsah)


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> &nbsp; <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 

Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .