Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Newer
Older
100644 608 lines (431 sloc) 18.054 kB
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
1 = Sinatra
2 <i>Fontos megjegyzés: Ez a dokumentum csak egy fordítása az angol nyelvű
3 változat, és lehet, hogy nem naprakész.</i>
4
5 A Sinatra egy DSL webalkalmazások Ruby nyelven történő fejlesztéséhez, minimális
6 energiabefektetéssel:
7
8 # myapp.rb
9 require 'sinatra'
10 get '/' do
11 'Helló Világ!'
12 end
13
14 Telepítsd a gem-et és indítsd el az alkalmazást a következőképpen:
15
16 sudo gem install sinatra
17 ruby -rubygems myapp.rb
18
19 Az alkalmazás elérhető lesz itt: http://localhost:4567
20
21 == Útvonalak (routes)
22
23 A Sinatrában az útvonalat egy HTTP metódus és egy URL-re illeszkedő minta
24 párosa alkotja. Minden egyes útvonalhoz tartozik egy blokk:
25
26 get '/' do
27 .. megjelenítünk valamit ..
28 end
29
30 post '/' do
31 .. létrehozunk valamit ..
32 end
33
34 put '/' do
35 .. frissítünk valamit ..
36 end
37
38 delete '/' do
39 .. törlünk valamit ..
40 end
41
42 Az útvonalak illeszkedését a rendszer a definiálásuk sorrendjében
43 ellenőrzi. Sorrendben mindig az első illeszkedő útvonalhoz tartozó metódus kerül
44 meghívásra.
45
46 Az útvonalminták tartalmazhatnak paramétereket is, melyeket a <tt>params</tt>
47 hash-ből érhetünk el:
48
49 get '/hello/:name' do
50 # illeszkedik a "GET /hello/foo" és a "GET /hello/bar" útvonalakra
51 # ekkor params[:name] értéke 'foo' vagy 'bar' lesz
52 "Helló #{params[:name]}!"
53 end
54
55 A kulcsszavas argumentumokat (named parameters) blokk paraméterek útján
56 is el tudod érni:
57
58 get '/hello/:name' do |n|
59 "Helló #{n}!"
60 end
61
62 Az útvonalmintákban szerepelhetnek joker paraméterek is, melyeket a
63 <tt>params[:splat]</tt> tömbön keresztül tudunk elérni.
64
65 get '/say/*/to/*' do
66 # illeszkedik a /say/hello/to/world mintára
67 params[:splat] # => ["hello", "world"]
68 end
69
70 get '/download/*.*' do
71 # illeszkedik a /download/path/to/file.xml mintára
72 params[:splat] # => ["path/to/file", "xml"]
73 end
74
75 Reguláris kifejezéseket is felvehetünk az útvonalba:
76
77 get %r{/hello/([\w]+)} do
78 "Helló, #{params[:captures].first}!"
79 end
80
81 Vagy blokk paramétereket:
82
83 get %r{/hello/([\w]+)} do |c|
84 "Helló, #{c}!"
85 end
86
87 Az útvonalak azonban számos egyéb illeszkedési feltétel szerint is
88 tervezhetők, így például az user agent karakterláncot alapul véve:
89
90 get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
91 "A Songbird #{params[:agent][0]} verzióját használod"
92 end
93
94 get '/foo' do
95 # illeszkedik az egyéb user agentekre
96 end
97
98 == Statikus állományok
99
100 A statikus fájlok kiszolgálása a <tt>./public</tt> könyvtárból
101 történik, de természetesen más könyvtárat is megadhatsz erre a célra,
d1ab58d @rkh rename public to public_folder, fixes #301
rkh authored
102 mégpedig a <tt>:public_folder</tt> kapcsoló beállításával:
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
103
d1ab58d @rkh rename public to public_folder, fixes #301
rkh authored
104 set :public_folder, File.dirname(__FILE__) + '/static'
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
105
106 Fontos mgejegyezni, hogy a nyilvános könyvtár neve nem szerepel az URL-ben.
107 A <tt>./public/css/style.css</tt> fájl az
108 <tt>http://example.com/css/style.css</tt> URL-en lesz elérhető.
109
110 == Nézetek és Sablonok
111
112 A sablonfájlokat rendszerint a <tt>./views</tt> könyvtárba helyezzük, de
113 itt is lehetőség nyílik egyéb könyvtár használatára:
114
115 set :views, File.dirname(__FILE__) + '/templates'
116
117 Nagyon fontos észben tartani, hogy a sablononkra mindig szimbólumokkal
118 hivatkozunk, még akkor is, ha egyéb (ebben az esetben a
119 <tt>:'subdir/template'</tt>) könyvtárban tároljuk őket. A renderelő
120 metódusok minden, nekik közvetlenül átadott karakterláncot megjelenítenek.
121
122 === Haml sablonok
123
124 HAML sablonok rendereléséhez szükségünk lesz a haml gem-re vagy könyvtárra:
125
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
126 # Importáljuk be a haml-t az alkalmazásba
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
127 require 'haml'
128
129 get '/' do
130 haml :index
131 end
132
133 Ez szépen lerendereli a <tt>./views/index.haml</tt> sablont.
134
135 A {Haml kapcsolói}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Haml.html]
136 globálisan is beállíthatók a Sinatra konfigurációi között, lásd az
137 {Options and Configurations}[http://www.sinatrarb.com/configuration.html] lapot.
138 A globális beállításokat lehetőségünk van felülírni metódus szinten is.
139
140 set :haml, {:format => :html5 } # az alapértelmezett Haml formátum az :xhtml
141
142 get '/' do
143 haml :index, :haml_options => {:format => :html4 } # immár felülírva
144 end
145
146
147 === Erb sablonok
148
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
149 # Importáljuk be az erb-t az alkalmazásba
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
150 require 'erb'
151
152 get '/' do
153 erb :index
154 end
155
156 Ez a <tt>./views/index.erb</tt> sablont fogja lerenderelni.
157
158 === Builder sablonok
159
160 Szükségünk lesz a builder gem-re vagy könyvtárra a builder sablonok
161 rendereléséhez:
162
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
163 # Importáljuk be a builder-t az alkalmazásba
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
164 require 'builder'
165
166 get '/' do
167 builder :index
168 end
169
170 Ez pedig a <tt>./views/index.builder</tt> állományt fogja renderelni.
171
172 === Sass sablonok
173
e93951e @burningTyger You still need the haml gem for sass/scss. However, this will change …
burningTyger authored
174 Sass sablonok használatához szükség lesz a haml gem-re vagy könyvtárra:
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
175
314a98f @rkh Remove uneccessary # from READMEs.
rkh authored
176 # Be kell importálni a haml, vagy a sass könyvtárat
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
177 require 'sass'
178
179 get '/stylesheet.css' do
180 sass :stylesheet
181 end
182
183 Így a <tt>./views/stylesheet.sass</tt> fájl máris renderelhető.
184
185 A {Sass kapcsolói}[http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html]
186 globálisan is beállíthatók a Sinatra konfigurációi között, lásd az
187 {Options and Configurations}[http://www.sinatrarb.com/configuration.html] lapot.
188 A globális beállításokat lehetőségünk van felülírni metódus szinten is.
189
190 set :sass, {:style => :compact } # az alapértelmezett Sass stílus a :nested
191
192 get '/stylesheet.css' do
193 sass :stylesheet, :sass_options => {:style => :expanded } # felülírva
194 end
195
196
197 === Beágyazott sablonok
198
199 get '/' do
200 haml '%div.title Helló Világ'
201 end
202
203 Lerendereli a beágyazott sablon karakerláncát.
204
205 === Változók elérése a sablonokban
206
207 A sablonok ugyanabban a kontextusban kerülnek kiértékelésre, mint az
208 útvonal metódusok (route handlers). Az útvonal metódusokban megadott
209 változók közvetlenül elérhetőek lesznek a sablonokban:
210
211 get '/:id' do
212 @foo = Foo.find(params[:id])
213 haml '%h1= @foo.name'
214 end
215
216 De megadhatod egy lokális változókat tartalmazó explicit hash-ben is:
217
218 get '/:id' do
219 foo = Foo.find(params[:id])
220 haml '%h1= foo.name', :locals => { :foo => foo }
221 end
222
223 Ezt leginkább akkor érdemes megtenni, ha partial-eket akarunk renderelni
224 valamely más sablonból.
225
226 === Fájlon belüli sablonok
227
228 Sablonokat úgy is megadhatunk, hogy egyszerűen az alkalmazás fájl
229 végére begépeljük őket:
230
231 require 'rubygems'
232 require 'sinatra'
233
234 get '/' do
235 haml :index
236 end
237
238 __END__
239
240 @@ layout
241 %html
242 = yield
243
244 @@ index
245 %div.title Helló Világ!!!!!
246
247 Megjegyzés: azok a fájlon belüli sablonok, amelyek az alkalmazás fájl végére
248 kerülnek és függnek a sinatra könyvtártól, automatikusan betöltődnek.
249 Ha ugyanezt más alkalmazásfájlban is szeretnéd megtenni, hívd meg
250 a <tt>use_in_file_templates!</tt> metódust az adott fájlban.
251
252 === Kulcsszavas sablonok
253
254 Sablonokat végül a felsőszintű <tt>template</tt> metódussal is
255 definiálhatunk:
256
257 template :layout do
258 "%html\n =yield\n"
259 end
260
261 template :index do
262 '%div.title Helló Világ!'
263 end
264
265 get '/' do
266 haml :index
267 end
268
269 Ha létezik "layout" nevű sablon, akkor az minden esetben meghívódik, amikor
270 csak egy sablon renderelésre kerül. A layoutokat ki lehet kapcsolni a
271 <tt>:layout => false</tt> meghívásával.
272
273 get '/' do
274 haml :index, :layout => !request.xhr?
275 end
276
277 == Helperek
278
279 Használd a felső szintű <tt>helpers</tt> metódust azokhoz a helper
280 függvényekhez, amiket az útvonal metódusokban és a sablonokban akarsz
281 használni:
282
283 helpers do
284 def bar(name)
285 "#{name}bar"
286 end
287 end
288
289 get '/:name' do
290 bar(params[:name])
291 end
292
293 == Szűrők (filters)
294
295 Az előszűrők (before filter) az adott hívás kontextusában minden egyes
296 kérés alkalmával kiértékelődnek, így módosíthatják a kérést és a
297 választ egyaránt. A szűrőkbe felvett példányváltozók elérhetőek lesznek
298 az útvonalakban és a sablonokban is:
299
300 before do
301 @note = 'Csá!'
302 request.path_info = '/foo/bar/baz'
303 end
304
305 get '/foo/*' do
306 @note #=> 'Szeva!'
307 params[:splat] #=> 'bar/baz'
308 end
309
310 Az utószűrők az egyes kérések után, az adott kérés kontextusában kerülnek
311 kiértékelésre, így ezek is képesek módosítani a kérést és a választ egyaránt.
312 Az előszűrőkben és úvonalakban létrehozott példányváltozók elérhetőek lesznek
313 az utószűrők számára:
314
315 after do
316 puts response.status
317 end
318
319 == Megállítás
320
321 Egy kérés szűrőben vagy útvonalban történő azonnal blokkolásához
322 használd a következő parancsot:
323
324 halt
325
326 A megállításkor egy blokktörzset is megadhatsz ...
327
328 halt 'ez fog megjelenni a törzsben'
329
330 Vagy állítsd be a HTTP státuszt és a törzset is egyszerre ...
331
332 halt 401, 'menj innen!'
333
334 == Passzolás
335
336 Az útvonalak továbbadhatják a végrehajtást egy másik útvonalnak
337 a <tt>pass</tt> függvényhívással:
338
339 get '/guess/:who' do
340 pass unless params[:who] == 'Frici'
341 "Elkaptál!"
342 end
343
344 get '/guess/*' do
345 "Elhibáztál!"
346 end
347
348 Az útvonal blokkja azonnal kilép és átadja a vezérlést a következő
349 illeszkedő útvonalnak. Ha nem talál megfelelő útvonalat, a Sinatra
350 egy 404-es hibával tér vissza.
351
352 == Beállítások
353
354 Csak indításkor, de minden környezetre érvényesen fusson le:
355
356 configure do
357 ...
358 end
359
360 Csak akkor fusson le, ha a környezet (a RACK_ENV környezeti változóban)
361 <tt>:production</tt>-ra van állítva:
362
363 configure :production do
364 ...
365 end
366
367 Csak akkor fusson le, ha a környezet <tt>:production</tt> vagy <tt>:test</tt>:
368
369 configure :production, :test do
370 ...
371 end
372
373 == Hibakezelés
374
375 A hibakezelők ugyanabban a kontextusban futnak le, mint az útvonalak és
376 előszűrők, ezért számukra is elérhetőek mindazok a könyvtárak, amelyek
377 az utóbbiak rendelkezésére is állnak; így például a <tt>haml</tt>,
378 az <tt>erb</tt>, a <tt>halt</tt> stb.
379
380 === Nem található
381
382 Amikor a <tt>Sinatra::NotFound</tt> kivétel fellép, vagy a válasz HTTP
383 státuszkódja 404-es, mindig a <tt>not_found</tt> metódus hívódik meg.
384
385 not_found do
386 'Sehol sem találom, amit keresel'
387 end
388
389 === Hiba
390
391 Az +error+ metódus hívódik meg olyankor, amikor egy útvonal, blokk vagy
392 előszűrő kivételt vált ki. A kivétel objektum lehívható a
393 <tt>sinatra.error</tt> Rack változótól:
394
395 error do
396 'Elnézést, de valami szörnyű hiba lépett fel - ' + env['sinatra.error'].name
397 end
398
399 Egyéni hibakezelés:
400
401 error MyCustomError do
66f1256 @rkh env is accessable directly, no need to use request.env
rkh authored
402 'Szóval az van, hogy...' + env['sinatra.error'].message
58d8ea2 @yaanno Hungarian README translation.
yaanno authored
403 end
404
405 És amikor fellép:
406
407 get '/' do
408 raise MyCustomError, 'valami nem stimmel!'
409 end
410
411 Ez fog megjelenni:
412
413 Szóval az van, hogy... valami nem stimmel!
414
415 A Sinatra speciális <tt>not_found</tt> és <tt>error</tt> hibakezelőket
416 használ, amikor a futtatási környezet fejlesztői módba van kapcsolva.
417
418 == Mime típusok
419
420 A <tt>send_file</tt> metódus használatakor, vagy statikus fájlok
421 kiszolgálásakor előfordulhat, hogy a Sinatra nem ismeri fel a fájlok
422 mime típusát. Ilyenkor használd a +mime_type+ kapcsolót a fájlkiterjesztés
423 bevezetéséhez:
424
425 mime_type :foo, 'text/foo'
426
427 == Rack Middleware
428
429 A Sinatra egy Ruby keretrendszerek számára kifejlesztett egyszerű és szabványos
430 interfészre, a {Rack}[http://rack.rubyforge.org/] -re épül. A Rack fejlesztői
431 szempontból egyik legérdekesebb jellemzője, hogy támogatja az úgynevezett
432 "middleware" elnevezésű komponenseket, amelyek beékelődnek a szerver és az
433 alkalmazás közé, így képesek megfigyelni és/vagy módosítani a HTTP
434 kéréseket és válaszokat. Segítségükkel különféle, egységesen működő
435 funkciókat építhetünk be rendszerünkbe.
436
437 A Sinatra keretrendszerben gyerekjáték a Rack middleware-ek behúzása a
438 +use+ metódus segítségével:
439
440 require 'sinatra'
441 require 'my_custom_middleware'
442
443 use Rack::Lint
444 use MyCustomMiddleware
445
446 get '/hello' do
447 'Helló Világ'
448 end
449
450 A +use+ metódus szemantikája megegyezik a
451 Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] DSL-ben
452 használt +use+ metóduséval (az említett DSL-t leginkább rackup állományokban
453 használják). Hogy egy példát említsünk, a +use+ metódus elfogad
454 változókat és blokkokat egyaránt, akár kombinálva is ezeket:
455
456 use Rack::Auth::Basic do |username, password|
457 username == 'admin' && password == 'titkos'
458 end
459
460 A Rack terjesztéssel egy csomó alap middleware komponens is érkezik,
461 amelyekkel a naplózás, URL útvonalak megadása, autentikáció és
462 munkamenet-kezelés könnyen megvalósítható. A Sinatra ezek közül elég
463 sokat automatikusan felhasznál a beállításoktól függően, így ezek
464 explicit betöltésével (+use+) nem kell bajlódnod.
465
466 == Tesztelés
467
468 Sinatra teszteket bármely Rack alapú tesztelő könyvtárral vagy
469 keretrendszerrel készíthetsz. Mi a {Rack::Test}[http://gitrdoc.com/brynary/rack-test]
470 könyvtárat ajánljuk:
471
472 require 'my_sinatra_app'
473 require 'rack/test'
474
475 class MyAppTest < Test::Unit::TestCase
476 include Rack::Test::Methods
477
478 def app
479 Sinatra::Application
480 end
481
482 def test_my_default
483 get '/'
484 assert_equal 'Helló Világ!', last_response.body
485 end
486
487 def test_with_params
488 get '/meet', :name => 'Frici'
489 assert_equal 'Helló Frici!', last_response.body
490 end
491
492 def test_with_rack_env
493 get '/', {}, 'HTTP_USER_AGENT' => 'Songbird'
494 assert_equal "Songbird-öt használsz!", last_response.body
495 end
496 end
497
498 Megjegyzés: A beépített Sinatra::Test és Sinatra::TestHarness osztályok
499 a 0.9.2-es kiadástól kezdve elavultnak számítanak.
500
501 == Sinatra::Base - Middleware-ek, könyvtárak és moduláris alkalmazások
502
503 Az alkalmazást felső szinten építeni megfelelhet mondjuk egy kisebb
504 app esetén, ám kifejezetten károsnak bizonyulhat olyan komolyabb,
505 újra felhasználható komponensek készítésekor, mint például egy Rack
506 middleware, Rails metal, egyszerűbb kiszolgáló komponenssel bíró
507 könyvtárak vagy éppen Sinatra kiterjesztések. A felső szintű DSL
508 bepiszkítja az Objektum névteret, ráadásul kisalkalmazásokra szabott
509 beállításokat feltételez (így például egyetlen alkalmazásfájl, ./public
510 és ./views könyvtár meglétét, naplózást, kivételkezelő oldalt stb.).
511 Itt jön a képbe a Sinatra::Base osztály:
512
513 require 'sinatra/base'
514
515 class MyApp < Sinatra::Base
516 set :sessions, true
517 set :foo, 'bar'
518
519 get '/' do
520 'Helló Világ!'
521 end
522 end
523
524 A MyApp osztály immár önálló Rack komponensként, mondjuk Rack middleware-ként
525 vagy alkalmazásként, esetleg Rails metal-ként is tud működni. Közvetlenül
526 használhatod (+use+) vagy futtathatod (+run+) az osztályodat egy rackup
527 konfigurációs állományban (+config.ru+), vagy egy szerverkomponenst
528 tartalmazó könyvtár vezérlésekor:
529
530 MyApp.run! :host => 'localhost', :port => 9090
531
532 A Sinatra::Base gyermekosztályaiban elérhető metódusok egyúttal a felső
533 szintű DSL-en keresztül is hozzáférhetők. A legtöbb felső szintű
534 alkalmazás átalakítható Sinatra::Base alapú komponensekké két lépésben:
535
536 * A fájlban nem a +sinatra+, hanem a +sinatra/base+ osztályt kell
537 beimportálni, mert egyébként az összes Sinatra DSL metódus a fő
538 névtérbe kerül.
539 * Az alkalmazás útvonalait, hibakezelőit, szűrőit és beállításait
540 a Sinatra::Base osztály gyermekosztályaiban kell megadni.
541
542 A +Sinatra::Base+ osztály igazából egy üres lap: a legtöbb funkció
543 alapból ki van kapcsolva, beleértve a beépített szervert is. A
544 beállításokkal és az egyes kapcsolók hatásával az
545 {Options and Configuration}[http://sinatra.github.com/configuration.html] lap
546 foglalkozik.
547
548 Széljegyzet: A Sinatra felső szintű DSL-je egy egyszerű delegációs
549 rendszerre épül. A Sinatra::Application osztály - a Sinatra::Base egy
550 speciális osztályaként - fogadja az összes :get, :put, :post,
551 :delete, :before, :error, :not_found, :configure és :set üzenetet,
552 ami csak a felső szintre beérkezik. Érdemes utánanézned a kódban,
553 miképp {kerül be}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/main.rb#L25]
554 a {Sinatra::Delegator mixin}[http://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L1064]
555 a fő névtérbe.
556
557 == Parancssori lehetőségek
558
559 Sinatra alkalmazásokat közvetlenül futtathatunk:
560
561 ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-s HANDLER]
562
563 Az alábbi kapcsolókat ismeri fel a rendszer:
564
565 -h # segítség
566 -p # a port beállítása (alapértelmezés szerint ez a 4567-es)
567 -e # a környezet beállítása (alapértelmezés szerint ez a development)
568 -s # a rack szerver/handler beállítása (alapértelmezetten ez a thin)
569 -x # a mutex lock bekapcsolása (alapértelmezetten ki van kapcsolva)
570
571 == Fejlesztői változat
572
573 Ha a Sinatra legfrissebb, fejlesztői változatát szeretnéd használni,
574 készíts egy helyi másolatot és indítsd az alkalmazásodat úgy,
575 hogy a <tt>sinatra/lib</tt> könyvtár elérhető legyen a
576 <tt>LOAD_PATH</tt>-on:
577
578 cd myapp
579 git clone git://github.com/sinatra/sinatra.git
580 ruby -Isinatra/lib myapp.rb
581
582 De hozzá is adhatod a <tt>sinatra/lib</tt> könyvtárat a <tt>LOAD_PATH</tt>-hoz
583 az alkalmazásodban:
584
585 $LOAD_PATH.unshift File.dirname(__FILE__) + '/sinatra/lib'
586 require 'rubygems'
587 require 'sinatra'
588
589 get '/about' do
590 "A következő változatot futtatom " + Sinatra::VERSION
591 end
592
593 A Sinatra frissítését később így végezheted el:
594
595 cd myproject/sinatra
596 git pull
597
598 == További információk
599
600 * {A projekt weboldala}[http://sinatra.github.com/] - Kiegészítő dokumentáció,
601 hírek, hasznos linkek
602 * {Közreműködés}[http://sinatra.github.com/contributing.html] - Hibát találtál?
603 Segítségre van szükséged? Foltot küldenél be?
604 * {Lighthouse}[http://sinatra.lighthouseapp.com] - Hibakövetés és kiadások
605 * {Twitter}[http://twitter.com/sinatra]
606 * {Levelezőlista}[http://groups.google.com/group/sinatrarb]
607 * {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] a http://freenode.net címen
Something went wrong with that request. Please try again.