sinatra 1.3.0.d → 1.3.0.e
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- data/.gitignore +6 -0
- data/.yardopts +4 -0
- data/CHANGES +80 -3
- data/Gemfile +18 -12
- data/README.de.rdoc +189 -381
- data/README.es.rdoc +193 -316
- data/README.fr.rdoc +327 -475
- data/README.jp.rdoc +7 -1
- data/README.rdoc +132 -101
- data/README.ru.rdoc +3 -3
- data/README.zh.rdoc +2 -2
- data/Rakefile +19 -27
- data/lib/sinatra/base.rb +186 -262
- data/lib/sinatra/version.rb +3 -0
- data/sinatra.gemspec +12 -128
- data/test/base_test.rb +1 -1
- data/test/builder_test.rb +1 -1
- data/test/coffee_test.rb +1 -1
- data/test/creole_test.rb +1 -1
- data/test/delegator_test.rb +9 -7
- data/test/encoding_test.rb +1 -1
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +7 -4
- data/test/haml_test.rb +1 -1
- data/test/helper.rb +16 -1
- data/test/helpers_test.rb +12 -1
- data/test/less_test.rb +1 -1
- data/test/liquid_test.rb +1 -1
- data/test/mapped_error_test.rb +44 -1
- data/test/markaby_test.rb +1 -1
- data/test/markdown_test.rb +1 -1
- data/test/middleware_test.rb +1 -1
- data/test/nokogiri_test.rb +1 -1
- data/test/radius_test.rb +1 -1
- data/test/rdoc_test.rb +2 -2
- data/test/readme_test.rb +136 -0
- data/test/request_test.rb +1 -1
- data/test/response_test.rb +13 -3
- data/test/result_test.rb +3 -3
- data/test/route_added_hook_test.rb +1 -1
- data/test/routing_test.rb +9 -2
- data/test/sass_test.rb +1 -1
- data/test/scss_test.rb +1 -1
- data/test/server_test.rb +1 -1
- data/test/settings_test.rb +55 -22
- data/test/sinatra_test.rb +1 -1
- data/test/slim_test.rb +1 -1
- data/test/static_test.rb +22 -1
- data/test/templates_test.rb +1 -1
- data/test/textile_test.rb +1 -1
- metadata +47 -59
- data/lib/sinatra/rack.rb +0 -44
data/README.es.rdoc
CHANGED
@@ -82,6 +82,12 @@ accesibles a través del arreglo <tt>params[:splat]</tt>:
|
|
82
82
|
params[:splat] # => ["path/al/archivo", "xml"]
|
83
83
|
end
|
84
84
|
|
85
|
+
O, con parámetros de bloque:
|
86
|
+
|
87
|
+
get '/descargar/*.*' do |path, ext|
|
88
|
+
[path, ext] # => ["path/al/archivo", "xml"]
|
89
|
+
end
|
90
|
+
|
85
91
|
Rutas con Expresiones Regulares:
|
86
92
|
|
87
93
|
get %r{/hola/([\w]+)} do
|
@@ -213,199 +219,174 @@ ejemplo, el archivo <tt>./public/css/style.css</tt> se accede a través de
|
|
213
219
|
|
214
220
|
== Vistas / Plantillas
|
215
221
|
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
set :views, File.dirname(__FILE__) + '/plantillas'
|
220
|
-
|
221
|
-
Es importante acordarse que siempre tenés que referenciar a las plantillas con
|
222
|
-
símbolos, incluso cuando se encuentran en un subdirectorio (en este caso tenés
|
223
|
-
que usar <tt>:'subdir/plantilla'</tt>). Tenés que usar un símbolo porque los
|
224
|
-
métodos de renderización van a renderizar directamente cualquier string que se
|
225
|
-
les pase como argumento.
|
226
|
-
|
227
|
-
=== Plantillas Haml
|
228
|
-
|
229
|
-
La gem/librería <tt>haml</tt> es necesaria para para renderizar plantillas HAML:
|
230
|
-
|
231
|
-
# Vas a necesitar requerir haml en tu app
|
232
|
-
require 'haml'
|
222
|
+
Cada lenguaje de plantilla se expone a través de un método de renderizado que
|
223
|
+
lleva su nombre. Estos métodos simplemente devuelven un string:
|
233
224
|
|
234
225
|
get '/' do
|
235
|
-
|
226
|
+
erb :index
|
236
227
|
end
|
237
228
|
|
238
|
-
Renderiza <tt
|
239
|
-
|
240
|
-
Las {opciones de Haml}[http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html#options]
|
241
|
-
pueden ser ajustadas globalmente a través de las configuraciones de Sinatra,
|
242
|
-
ver {Opciones y Configuraciones}[http://www.sinatrarb.com/configuration.html],
|
243
|
-
y reemplazadas individualmente.
|
229
|
+
Renderiza <tt>views/index.erb</tt>.
|
244
230
|
|
245
|
-
|
231
|
+
En lugar del nombre de la plantilla podés proporcionar directamente el
|
232
|
+
contenido de la misma:
|
246
233
|
|
247
234
|
get '/' do
|
248
|
-
|
235
|
+
codigo = "<%= Time.now %>"
|
236
|
+
erb codigo
|
249
237
|
end
|
250
238
|
|
251
|
-
|
252
|
-
|
253
|
-
# Vas a necesitar requerir erb en tu app
|
254
|
-
require 'erb'
|
239
|
+
Los métodos de renderizado, aceptan además un segundo argumento, el hash de
|
240
|
+
opciones:
|
255
241
|
|
256
242
|
get '/' do
|
257
|
-
erb :index
|
243
|
+
erb :index, :layout => :post
|
258
244
|
end
|
259
245
|
|
260
|
-
Renderiza <tt
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
La gem/librería <tt>erubis</tt> es necesaria para renderizar plantillas Erubis:
|
246
|
+
Renderiza <tt>views/index.erb</tt> embebido en <tt>views/post.erb</tt> (por
|
247
|
+
defecto, la plantilla :index es embebida en <tt>views/layout.erb</tt> siempre y
|
248
|
+
cuando este último archivo exista).
|
265
249
|
|
266
|
-
|
267
|
-
|
250
|
+
Cualquier opción que Sinatra no entienda le será pasada al motor de renderizado
|
251
|
+
de la plantilla:
|
268
252
|
|
269
253
|
get '/' do
|
270
|
-
|
254
|
+
haml :index, :format => :html5
|
271
255
|
end
|
272
256
|
|
273
|
-
|
257
|
+
Además podés definir las opciones para un lenguaje de plantillas de forma
|
258
|
+
general:
|
274
259
|
|
275
|
-
|
276
|
-
|
277
|
-
require 'erubis'
|
278
|
-
Tilt.register :erb, Tilt[:erubis]
|
260
|
+
set :haml, :format => :html5
|
279
261
|
|
280
262
|
get '/' do
|
281
|
-
|
263
|
+
haml :index
|
282
264
|
end
|
283
265
|
|
284
|
-
|
285
|
-
|
286
|
-
=== Plantillas Builder
|
266
|
+
Las opciones pasadas al método de renderizado tienen precedencia sobre las
|
267
|
+
definidas mediante +set+.
|
287
268
|
|
288
|
-
|
289
|
-
builder:
|
269
|
+
Opciones disponibles:
|
290
270
|
|
291
|
-
|
292
|
-
|
271
|
+
[locals]
|
272
|
+
Lista de variables locales pasadas al documento. Resultan muy útiles cuando
|
273
|
+
se combinan con parciales.
|
274
|
+
Ejemplo: <tt>erb "<%= foo %>", :locals => {:foo => "bar"}</tt>
|
293
275
|
|
294
|
-
|
295
|
-
|
296
|
-
|
276
|
+
[default_encoding]
|
277
|
+
Encoding utilizado cuando el de un string es dudoso. Por defecto toma el
|
278
|
+
valor de <tt>settings.default_encoding</tt>.
|
297
279
|
|
298
|
-
|
280
|
+
[views]
|
281
|
+
Directorio desde donde se cargan las vistas. Por defecto toma el valor de
|
282
|
+
<tt>settings.views</tt>.
|
299
283
|
|
300
|
-
|
284
|
+
[layout]
|
285
|
+
Si es +true+ o +false+ indica que se debe usar, o nó, un layout,
|
286
|
+
respectivamente. También puede ser un símbolo que especifique qué plantilla
|
287
|
+
usar. Ejemplo: <tt>erb :index, :layout => !request.xhr?</tt>
|
301
288
|
|
302
|
-
|
303
|
-
|
289
|
+
[content_type]
|
290
|
+
Content-Type que produce la plantilla. El valor por defecto depende de cada
|
291
|
+
lenguaje de plantillas.
|
304
292
|
|
305
|
-
|
306
|
-
|
293
|
+
[scope]
|
294
|
+
Ámbito en el que se renderiza la plantilla. Por defecto utiliza la instancia
|
295
|
+
de la aplicación. Tené en cuenta que si cambiás esta opción las variables de
|
296
|
+
instancia y los helpers van a dejar de estar disponibles.
|
307
297
|
|
308
|
-
|
309
|
-
|
310
|
-
|
298
|
+
[layout_engine]
|
299
|
+
Motor de renderizado de plantillas que usa para el layout. Resulta
|
300
|
+
conveniente para lenguajes que no soportan layouts. Por defecto toma el valor
|
301
|
+
del motor usado para renderizar la plantilla.
|
302
|
+
Ejemplo: <tt>set :rdoc, :layout_engine => :erb</tt>
|
311
303
|
|
312
|
-
|
304
|
+
Se asume que las plantillas están ubicadas directamente bajo el directorio
|
305
|
+
<tt>./views</tt>. Para usar un directorio de vistas diferente:
|
313
306
|
|
314
|
-
|
307
|
+
set :views, settings.root + '/plantillas'
|
315
308
|
|
316
|
-
|
317
|
-
|
309
|
+
Es importante acordarse que siempre tenés que referenciar a las plantillas con
|
310
|
+
símbolos, incluso cuando se encuentran en un subdirectorio (en este caso tenés
|
311
|
+
que usar <tt>:'subdir/plantilla'</tt>). Tenés que usar un símbolo porque los
|
312
|
+
métodos de renderización van a renderizar directamente cualquier string que se
|
313
|
+
les pase como argumento.
|
318
314
|
|
319
|
-
|
320
|
-
require 'sass'
|
315
|
+
=== Lenguajes de Plantillas Disponibles
|
321
316
|
|
322
|
-
|
323
|
-
|
324
|
-
|
317
|
+
Algunos lenguajes tienen varias implementaciones. Para especificar que
|
318
|
+
implementación usar (y para ser thread-safe), deberías requerirla antes de
|
319
|
+
usarla:
|
325
320
|
|
326
|
-
|
321
|
+
require 'rdiscount' # o require 'bluecloth'
|
322
|
+
get('/') { markdown :index }
|
327
323
|
|
328
|
-
|
329
|
-
pueden ser ajustadas globalmente a través de las configuraciones de Sinatra,
|
330
|
-
ver {Opciones y Configuraciones}[http://www.sinatrarb.com/configuration.html],
|
331
|
-
y reemplazadas individualmente.
|
324
|
+
=== Plantillas Haml
|
332
325
|
|
333
|
-
|
326
|
+
Dependencias:: {haml}[http://haml-lang.com/]
|
327
|
+
Extensiones de Archivo:: <tt>.haml</tt>
|
328
|
+
Ejemplo:: <tt>haml :index, :format => :html5</tt>
|
334
329
|
|
335
|
-
|
336
|
-
sass :stylesheet, :style => :expanded # reemplazado
|
337
|
-
end
|
330
|
+
=== Plantillas Erb
|
338
331
|
|
339
|
-
|
332
|
+
Dependencias:: {erubis}[http://www.kuwata-lab.com/erubis/] o
|
333
|
+
erb (incluida en Ruby)
|
334
|
+
Extensiones de Archivo:: <tt>.erb</tt>, <tt>.rhtml</tt> o <tt>.erubis</tt>
|
335
|
+
(solamente con Erubis)
|
336
|
+
Ejemplo:: <tt>erb :index</tt>
|
340
337
|
|
341
|
-
|
342
|
-
plantillas Scss:
|
338
|
+
=== Plantillas Builder
|
343
339
|
|
344
|
-
|
345
|
-
|
340
|
+
Dependencias:: {builder}[http://builder.rubyforge.org/]
|
341
|
+
Extensiones de Archivo:: <tt>.builder</tt>
|
342
|
+
Ejemplo:: <tt>builder { |xml| xml.em "hola" }</tt>
|
346
343
|
|
347
|
-
|
348
|
-
scss :stylesheet
|
349
|
-
end
|
344
|
+
Además, acepta un bloque con la definición de la plantilla (ver el ejemplo).
|
350
345
|
|
351
|
-
|
346
|
+
=== Plantillas Nokogiri
|
352
347
|
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
y reemplazadas individualmente.
|
348
|
+
Dependencias:: {nokogiri}[http://nokogiri.org/]
|
349
|
+
Extensiones de Archivo:: <tt>.nokogiri</tt>
|
350
|
+
Ejemplo:: <tt>nokogiri { |xml| xml.em "hola" }</tt>
|
357
351
|
|
358
|
-
|
352
|
+
Además, acepta un bloque con la definición de la plantilla (ver el ejemplo).
|
359
353
|
|
360
|
-
|
361
|
-
scss :stylesheet, :style => :expanded # reemplazado
|
362
|
-
end
|
354
|
+
=== Plantillas Sass
|
363
355
|
|
364
|
-
|
356
|
+
Dependencias:: {sass}[http://sass-lang.com/]
|
357
|
+
Extensiones de Archivo:: <tt>.sass</tt>
|
358
|
+
Ejemplo:: <tt>sass :stylesheet, :style => :expanded</tt>
|
365
359
|
|
366
|
-
|
360
|
+
=== Plantillas SCSS
|
367
361
|
|
368
|
-
|
369
|
-
|
362
|
+
Dependencias:: {scss}[http://sass-lang.com/]
|
363
|
+
Extensiones de Archivo:: <tt>.scss</tt>
|
364
|
+
Ejemplo:: <tt>scss :stylesheet, :style => :expanded</tt>
|
370
365
|
|
371
|
-
|
372
|
-
less :stylesheet
|
373
|
-
end
|
366
|
+
=== Plantillas Less
|
374
367
|
|
375
|
-
|
368
|
+
Dependencias:: {less}[http://www.lesscss.org/]
|
369
|
+
Extensiones de Archivo:: <tt>.less</tt>
|
370
|
+
Ejemplo:: <tt>less :stylesheet</tt>
|
376
371
|
|
377
372
|
=== Plantillas Liquid
|
378
373
|
|
379
|
-
|
374
|
+
Dependencias:: {liquid}[http://www.liquidmarkup.org/]
|
375
|
+
Extensiones de Archivo:: <tt>.liquid</tt>
|
376
|
+
Ejemplo:: <tt>liquid :index, :locals => { :clave => 'valor' }</tt>
|
380
377
|
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
get '/' do
|
385
|
-
liquid :index
|
386
|
-
end
|
387
|
-
|
388
|
-
Renderiza <tt>./views/index.liquid</tt>.
|
389
|
-
|
390
|
-
Como no vas a poder llamar a métodos de Ruby (excepto a +yield+) desde una
|
391
|
-
plantilla Liquid, casi siempre vas a querer pasarle locales:
|
392
|
-
|
393
|
-
liquid :index, :locals => { :clave => 'valor' }
|
378
|
+
Como no vas a poder llamar a métodos de Ruby (excepto por +yield+) desde una
|
379
|
+
plantilla Liquid, casi siempre vas a querer pasarle locales.
|
394
380
|
|
395
381
|
=== Plantillas Markdown
|
396
382
|
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
markdown :index
|
405
|
-
end
|
406
|
-
|
407
|
-
Renderiza <tt>./views/index.markdown</tt> (+md+ y +mkd+ también son extensiones
|
408
|
-
de archivo válidas).
|
383
|
+
Dependencias:: {rdiscount}[https://github.com/rtomayko/rdiscount],
|
384
|
+
{redcarpet}[https://github.com/tanoku/redcarpet],
|
385
|
+
{bluecloth}[http://deveiate.org/projects/BlueCloth],
|
386
|
+
{kramdown}[http://kramdown.rubyforge.org/] *o*
|
387
|
+
{maruku}[http://maruku.rubyforge.org/]
|
388
|
+
Extensiones de Archivo:: <tt>.markdown</tt>, <tt>.mkd</tt> y <tt>.md</tt>
|
389
|
+
Ejemplo:: <tt>markdown :index, :layout_engine => :erb</tt>
|
409
390
|
|
410
391
|
No es posible llamar métodos desde markdown, ni pasarle locales. Por lo tanto,
|
411
392
|
generalmente vas a usarlo en combinación con otro motor de renderizado:
|
@@ -420,52 +401,13 @@ plantillas:
|
|
420
401
|
|
421
402
|
Como no podés utilizar Ruby desde Markdown, no podés usar layouts escritos en
|
422
403
|
Markdown. De todos modos, es posible usar un motor de renderizado para el
|
423
|
-
layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt
|
424
|
-
|
425
|
-
get '/' do
|
426
|
-
markdown :index, :layout_engine => :erb
|
427
|
-
end
|
428
|
-
|
429
|
-
Renderiza <tt>./views/index.md</tt> con el layout <tt>./views/layout.erb</tt>.
|
430
|
-
|
431
|
-
Recordá que podés asignar las opciones de renderizado globalmente:
|
432
|
-
|
433
|
-
set :markdown, :layout_engine => :haml, :layout => :post
|
434
|
-
|
435
|
-
get '/' do
|
436
|
-
markdown :index
|
437
|
-
end
|
438
|
-
|
439
|
-
Renderiza <tt>./views/index.md</tt> (o cualquier otra plantilla Markdown) con
|
440
|
-
el layout <tt>./views/post.haml</tt>.
|
441
|
-
|
442
|
-
También es posible parsear Markdown con BlueCloth en lugar de RDiscount:
|
443
|
-
|
444
|
-
require 'bluecloth'
|
445
|
-
|
446
|
-
Tilt.register 'markdown', BlueClothTemplate
|
447
|
-
Tilt.register 'mkd', BlueClothTemplate
|
448
|
-
Tilt.register 'md', BlueClothTemplate
|
449
|
-
|
450
|
-
get '/' do
|
451
|
-
markdown :index
|
452
|
-
end
|
453
|
-
|
454
|
-
Renderiza <tt>./views/index.md</tt> con BlueCloth.
|
404
|
+
layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>.
|
455
405
|
|
456
406
|
=== Plantillas Textile
|
457
407
|
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
# Vas a necesitar requerir redcloth en tu app
|
462
|
-
require "redcloth"
|
463
|
-
|
464
|
-
get '/' do
|
465
|
-
textile :index
|
466
|
-
end
|
467
|
-
|
468
|
-
Renderiza <tt>./views/index.textile</tt>.
|
408
|
+
Dependencias:: {RedCloth}[http://redcloth.org/]
|
409
|
+
Extensiones de Archivo:: <tt>.textile</tt>
|
410
|
+
Ejemplo:: <tt>textile :index, :layout_engine => :erb</tt>
|
469
411
|
|
470
412
|
No es posible llamar métodos desde textile, ni pasarle locales. Por lo tanto,
|
471
413
|
generalmente vas a usarlo en combinación con otro motor de renderizado:
|
@@ -480,38 +422,13 @@ plantillas:
|
|
480
422
|
|
481
423
|
Como no podés utilizar Ruby desde Textile, no podés usar layouts escritos en
|
482
424
|
Textile. De todos modos, es posible usar un motor de renderizado para el
|
483
|
-
layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt
|
484
|
-
|
485
|
-
get '/' do
|
486
|
-
textile :index, :layout_engine => :erb
|
487
|
-
end
|
488
|
-
|
489
|
-
Renderiza <tt>./views/index.textile</tt> con el layout
|
490
|
-
<tt>./views/layout.erb</tt>.
|
491
|
-
|
492
|
-
Recordá que podés asignar las opciones de renderizado globalmente:
|
493
|
-
|
494
|
-
set :textile, :layout_engine => :haml, :layout => :post
|
495
|
-
|
496
|
-
get '/' do
|
497
|
-
textile :index
|
498
|
-
end
|
499
|
-
|
500
|
-
Renderiza <tt>./views/index.textile</tt> (o cualquier otra plantilla Textile)
|
501
|
-
con el layout <tt>./views/post.haml</tt>.
|
425
|
+
layout distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>.
|
502
426
|
|
503
427
|
=== Plantillas RDoc
|
504
428
|
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
require "rdoc/markup/to_html"
|
509
|
-
|
510
|
-
get '/' do
|
511
|
-
rdoc :index
|
512
|
-
end
|
513
|
-
|
514
|
-
Renderiza <tt>./views/index.rdoc</tt>.
|
429
|
+
Dependencias:: {rdoc}[http://rdoc.rubyforge.org/]
|
430
|
+
Extensiones de Archivo:: <tt>.rdoc</tt>
|
431
|
+
Ejemplo:: <tt>textile :LEEME, :layout_engine => :erb</tt>
|
515
432
|
|
516
433
|
No es posible llamar métodos desde rdoc, ni pasarle locales. Por lo tanto,
|
517
434
|
generalmente vas a usarlo en combinación con otro motor de renderizado:
|
@@ -526,109 +443,58 @@ plantillas:
|
|
526
443
|
|
527
444
|
Como no podés utilizar Ruby desde RDoc, no podés usar layouts escritos en RDoc.
|
528
445
|
De todos modos, es posible usar un motor de renderizado para el layout distinto
|
529
|
-
al de la plantilla pasando la opción <tt>:layout_engine</tt
|
530
|
-
|
531
|
-
get '/' do
|
532
|
-
rdoc :index, :layout_engine => :erb
|
533
|
-
end
|
534
|
-
|
535
|
-
Renderiza <tt>./views/index.rdoc</tt> con el layout <tt>./views/layout.erb</tt>.
|
536
|
-
|
537
|
-
Recordá que podés asignar las opciones de renderizado globalmente:
|
538
|
-
|
539
|
-
set :rdoc, :layout_engine => :haml, :layout => :post
|
540
|
-
|
541
|
-
get '/' do
|
542
|
-
rdoc :index
|
543
|
-
end
|
544
|
-
|
545
|
-
Renderiza <tt>./views/index.rdoc</tt> (o cualquier otra plantilla RDoc) con el
|
546
|
-
layout <tt>./views/post.haml</tt>.
|
446
|
+
al de la plantilla pasando la opción <tt>:layout_engine</tt>.
|
547
447
|
|
548
448
|
=== Plantillas Radius
|
549
449
|
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
require 'radius'
|
554
|
-
|
555
|
-
get '/' do
|
556
|
-
radius :index
|
557
|
-
end
|
450
|
+
Dependencias:: {radius}[http://radius.rubyforge.org/]
|
451
|
+
Extensiones de Archivo:: <tt>.radius</tt>
|
452
|
+
Ejemplo:: <tt>radius :index, :locals => { :clave => 'valor' }</tt>
|
558
453
|
|
559
|
-
|
560
|
-
|
561
|
-
Como no vas a poder llamar a métodos de Ruby (excepto a +yield+) desde una
|
562
|
-
plantilla Radius, casi siempre vas a querer pasarle locales:
|
563
|
-
|
564
|
-
radius :index, :locals => { :clave => 'valor' }
|
454
|
+
Como no vas a poder llamar a métodos de Ruby (excepto por +yield+) desde una
|
455
|
+
plantilla Radius, casi siempre vas a querer pasarle locales.
|
565
456
|
|
566
457
|
=== Plantillas Markaby
|
567
458
|
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
# Vas a necesitar requerir markaby en tu app
|
572
|
-
require 'markaby'
|
573
|
-
|
574
|
-
get '/' do
|
575
|
-
markaby :index
|
576
|
-
end
|
577
|
-
|
578
|
-
Renderiza <tt>./views/index.mab</tt>.
|
579
|
-
|
580
|
-
También podés usar Markaby inline:
|
581
|
-
|
582
|
-
get '/' do
|
583
|
-
markaby { h1 "Bienvenido!" }
|
584
|
-
end
|
459
|
+
Dependencias:: {markaby}[http://markaby.github.com/]
|
460
|
+
Extensiones de Archivo:: <tt>.mab</tt>
|
461
|
+
Ejemplos:: <tt>markaby { h1 "Bienvenido!" }</tt>
|
585
462
|
|
463
|
+
Además, acepta un bloque con la definición de la plantilla (ver el ejemplo).
|
586
464
|
|
587
465
|
=== Plantillas Slim
|
588
466
|
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
require 'slim'
|
593
|
-
|
594
|
-
get '/' do
|
595
|
-
slim :index
|
596
|
-
end
|
597
|
-
|
598
|
-
Renderiza <tt>./views/index.slim</tt>.
|
467
|
+
Dependencias:: {slim}[http://slim-lang.com/]
|
468
|
+
Extensiones de Archivo:: <tt>.slim</tt>
|
469
|
+
Ejemplo:: <tt>slim :index</tt>
|
599
470
|
|
600
471
|
=== Plantillas Creole
|
601
472
|
|
602
|
-
|
473
|
+
Dependencias:: {creole}[https://github.com/minad/creole]
|
474
|
+
Extensiones de Archivo:: <tt>.creole</tt>
|
475
|
+
Ejemplo:: <tt>creole :wiki, :layout_engine => :erb</tt>
|
603
476
|
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
get '/' do
|
608
|
-
creole :index
|
609
|
-
end
|
610
|
-
|
611
|
-
Renderiza <tt>./views/index.creole</tt>.
|
612
|
-
|
613
|
-
=== Plantillas CoffeeScript
|
477
|
+
No es posible llamar métodos desde creole, ni pasarle locales. Por lo tanto,
|
478
|
+
generalmente vas a usarlo en combinación con otro motor de renderizado:
|
614
479
|
|
615
|
-
|
616
|
-
opciones para ejecutar JavaScript:
|
480
|
+
erb :resumen, :locals => { :texto => cerole(:introduccion) }
|
617
481
|
|
618
|
-
|
619
|
-
|
620
|
-
* la gem/librería +therubyracer+
|
482
|
+
Tené en cuenta que también podés llamar al método +creole+ desde otras
|
483
|
+
plantillas:
|
621
484
|
|
622
|
-
|
485
|
+
%h1 Hola Desde Haml!
|
486
|
+
%p= creole(:saludos)
|
623
487
|
|
624
|
-
|
625
|
-
|
488
|
+
Como no podés utilizar Ruby desde Creole, no podés usar layouts escritos en
|
489
|
+
Creloe. De todos modos, es posible usar un motor de renderizado para el layout
|
490
|
+
distinto al de la plantilla pasando la opción <tt>:layout_engine</tt>.
|
626
491
|
|
627
|
-
|
628
|
-
coffee :application
|
629
|
-
end
|
492
|
+
=== Plantillas CoffeeScript
|
630
493
|
|
631
|
-
|
494
|
+
Dependencias:: {coffee-script}[https://github.com/josh/ruby-coffee-script]
|
495
|
+
y un {mecanismo para ejecutar javascript}[https://github.com/sstephenson/execjs/blob/master/README.md#readme]
|
496
|
+
Extensiones de Archivo:: <tt>.coffee</tt>
|
497
|
+
Ejemplo:: <tt>coffee :index</tt>
|
632
498
|
|
633
499
|
=== Plantillas Embebidas
|
634
500
|
|
@@ -653,7 +519,7 @@ O es posible especificar un Hash de variables locales explícitamente:
|
|
653
519
|
|
654
520
|
get '/:id' do
|
655
521
|
foo = Foo.find(params[:id])
|
656
|
-
haml '%h1=
|
522
|
+
haml '%h1= bar.nombre', :locals => { :bar => foo }
|
657
523
|
end
|
658
524
|
|
659
525
|
Esto es usado típicamente cuando se renderizan plantillas como parciales desde
|
@@ -977,7 +843,9 @@ Cuando usás <tt>send_file</tt> o archivos estáticos tal vez tengas tipos mime
|
|
977
843
|
que Sinatra no entiende. Usá +mime_type+ para registrarlos a través de la
|
978
844
|
extensión de archivo:
|
979
845
|
|
980
|
-
|
846
|
+
configure do
|
847
|
+
mime_type :foo, 'text/foo'
|
848
|
+
end
|
981
849
|
|
982
850
|
También lo podés usar con el ayudante +content_type+:
|
983
851
|
|
@@ -1484,11 +1352,17 @@ debugging, enrutamiento URL, autenticación, y manejo de sesiones. Sinatra
|
|
1484
1352
|
usa muchos de estos componentes automáticamente de acuerdo a su configuración
|
1485
1353
|
para que típicamente no tengas que usarlas (con +use+) explícitamente.
|
1486
1354
|
|
1355
|
+
Podés encontrar middleware útil en
|
1356
|
+
{rack}[https://github.com/rack/rack/tree/master/lib/rack],
|
1357
|
+
{rack-contrib}[https://github.com/rack/rack-contrib#readme],
|
1358
|
+
con {CodeRack}[http://coderack.org/] o en la
|
1359
|
+
{Rack wiki}[https://github.com/rack/rack/wiki/List-of-Middleware].
|
1360
|
+
|
1487
1361
|
== Pruebas
|
1488
1362
|
|
1489
1363
|
Las pruebas para las aplicaciones Sinatra pueden ser escritas utilizando
|
1490
1364
|
cualquier framework o librería de pruebas basada en Rack. Se recomienda usar
|
1491
|
-
{Rack::Test}[http://
|
1365
|
+
{Rack::Test}[http://rdoc.info/github/brynary/rack-test/master/frames]:
|
1492
1366
|
|
1493
1367
|
require 'mi_app_sinatra'
|
1494
1368
|
require 'test/unit'
|
@@ -1517,9 +1391,6 @@ cualquier framework o librería de pruebas basada en Rack. Se recomienda usar
|
|
1517
1391
|
end
|
1518
1392
|
end
|
1519
1393
|
|
1520
|
-
NOTA: El módulo Sinatra::Test y la clase Sinatra::TestHarness están
|
1521
|
-
deprecados a partir de la versión 0.9.2.
|
1522
|
-
|
1523
1394
|
== Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares
|
1524
1395
|
|
1525
1396
|
Definir tu aplicación en el top-level funciona bien para micro-aplicaciones
|
@@ -1528,8 +1399,8 @@ reutilizables como Rack middleware, Rails metal, simple librerías con un
|
|
1528
1399
|
componente de servidor, o incluso extensiones de Sinatra. El DSL de top-level
|
1529
1400
|
contamina el espacio de nombres de Object y asume una configuración apropiada
|
1530
1401
|
para micro-aplicaciones (por ejemplo, un único archivo de aplicación, los
|
1531
|
-
directorios
|
1532
|
-
etc.). Ahí es donde Sinatra::Base entra en el juego:
|
1402
|
+
directorios <tt>./public</tt> y <tt>./views</tt>, logging, página con detalles
|
1403
|
+
de excepción, etc.). Ahí es donde <tt>Sinatra::Base</tt> entra en el juego:
|
1533
1404
|
|
1534
1405
|
require 'sinatra/base'
|
1535
1406
|
|
@@ -1542,16 +1413,16 @@ etc.). Ahí es donde Sinatra::Base entra en el juego:
|
|
1542
1413
|
end
|
1543
1414
|
end
|
1544
1415
|
|
1545
|
-
Las subclases de Sinatra::Base tienen disponibles exactamente los
|
1546
|
-
métodos que los provistos por el DSL de top-level. La mayoría de las
|
1547
|
-
aplicaciones top-level se pueden convertir en componentes
|
1548
|
-
dos modificaciones:
|
1416
|
+
Las subclases de <tt>Sinatra::Base</tt> tienen disponibles exactamente los
|
1417
|
+
mismos métodos que los provistos por el DSL de top-level. La mayoría de las
|
1418
|
+
aplicaciones top-level se pueden convertir en componentes
|
1419
|
+
<tt>Sinatra::Base</tt> con dos modificaciones:
|
1549
1420
|
|
1550
1421
|
* Tu archivo debe requerir <tt>sinatra/base</tt> en lugar de +sinatra+; de otra
|
1551
1422
|
manera, todos los métodos del DSL de sinatra son importados dentro del
|
1552
1423
|
espacio de nombres principal.
|
1553
1424
|
* Poné las rutas, manejadores de errores, filtros y opciones de tu aplicación
|
1554
|
-
en una subclase de Sinatra::Base
|
1425
|
+
en una subclase de <tt>Sinatra::Base</tt>.
|
1555
1426
|
|
1556
1427
|
<tt>Sinatra::Base</tt> es una pizarra en blanco. La mayoría de las opciones están
|
1557
1428
|
desactivadas por defecto, incluyendo el servidor incorporado. Mirá
|
@@ -1580,7 +1451,7 @@ entre sus configuraciones:
|
|
1580
1451
|
|
1581
1452
|
Configuración Clásica Modular
|
1582
1453
|
|
1583
|
-
app_file archivo que carga sinatra
|
1454
|
+
app_file archivo que carga sinatra archivo con la subclase de Sinatra::Base
|
1584
1455
|
run $0 == app_file false
|
1585
1456
|
logging true false
|
1586
1457
|
method_override true false
|
@@ -1609,7 +1480,7 @@ Iniciar con:
|
|
1609
1480
|
O, con un archivo <tt>config.ru</tt>, que permite usar cualquier handler Rack:
|
1610
1481
|
|
1611
1482
|
# config.ru
|
1612
|
-
require 'mi_app'
|
1483
|
+
require './mi_app'
|
1613
1484
|
run MiApp
|
1614
1485
|
|
1615
1486
|
Después ejecutar:
|
@@ -1629,7 +1500,7 @@ Escribí el archivo de tu aplicación:
|
|
1629
1500
|
|
1630
1501
|
Y el <tt>config.ru</tt> correspondiente:
|
1631
1502
|
|
1632
|
-
require 'app'
|
1503
|
+
require './app'
|
1633
1504
|
run Sinatra::Application
|
1634
1505
|
|
1635
1506
|
=== ¿Cuándo Usar config.ru?
|
@@ -1660,7 +1531,7 @@ aplicación basada en Rack (Rails/Ramaze/Camping/...):
|
|
1660
1531
|
get('/login') { haml :login }
|
1661
1532
|
|
1662
1533
|
post('/login') do
|
1663
|
-
if params[:nombre]
|
1534
|
+
if params[:nombre] == 'admin' && params[:password] == 'admin'
|
1664
1535
|
session['nombre_de_usuario'] = params[:nombre]
|
1665
1536
|
else
|
1666
1537
|
redirect '/login'
|
@@ -1685,7 +1556,7 @@ aplicación basada en Rack (Rails/Ramaze/Camping/...):
|
|
1685
1556
|
|
1686
1557
|
Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
|
1687
1558
|
tiempo de ejecución sin tener que asignarlas a una constante. Para
|
1688
|
-
esto tenés
|
1559
|
+
esto tenés <tt>Sinatra.new</tt>:
|
1689
1560
|
|
1690
1561
|
require 'sinatra/base'
|
1691
1562
|
mi_app = Sinatra.new { get('/') { "hola" } }
|
@@ -1730,12 +1601,12 @@ disponibles.
|
|
1730
1601
|
|
1731
1602
|
=== Ámbito de Aplicación/Clase
|
1732
1603
|
|
1733
|
-
Cada aplicación Sinatra es una subclase de Sinatra::Base
|
1734
|
-
DSL de top-level (<tt>require 'sinatra'</tt>), entonces esta clase es
|
1735
|
-
Sinatra::Application
|
1736
|
-
Al nivel de la clase tenés métodos como +get+ o +before+, pero
|
1737
|
-
a los objetos +request+ o +session+, ya que hay una única
|
1738
|
-
aplicación para todas las peticiones.
|
1604
|
+
Cada aplicación Sinatra es una subclase de <tt>Sinatra::Base</tt>. Si estás
|
1605
|
+
usando el DSL de top-level (<tt>require 'sinatra'</tt>), entonces esta clase es
|
1606
|
+
<tt>Sinatra::Application</tt>, de otra manera es la subclase que creaste
|
1607
|
+
explícitamente. Al nivel de la clase tenés métodos como +get+ o +before+, pero
|
1608
|
+
no podés acceder a los objetos +request+ o +session+, ya que hay una única
|
1609
|
+
clase de la aplicación para todas las peticiones.
|
1739
1610
|
|
1740
1611
|
Las opciones creadas utilizando +set+ son métodos al nivel de la clase:
|
1741
1612
|
|
@@ -1835,21 +1706,25 @@ Las siguientes versiones de Ruby son soportadas oficialmente:
|
|
1835
1706
|
[ Ruby 1.9.2 ]
|
1836
1707
|
1.9.2 es soportado y recomendado. Tené en cuenta que Radius y Markaby no
|
1837
1708
|
son compatibles con 1.9 actualmente. Además, no usés 1.9.2p0, porque produce
|
1838
|
-
fallos de segmentación cuando se
|
1709
|
+
fallos de segmentación cuando se ejecuta Sinatra.
|
1839
1710
|
|
1840
1711
|
[ Rubinius ]
|
1841
1712
|
Rubinius es soportado oficialmente (Rubinius >= 1.2.3). Todo
|
1842
1713
|
funciona correctamente, incluyendo los lenguajes de plantillas.
|
1843
1714
|
|
1844
1715
|
[ JRuby ]
|
1845
|
-
JRuby es soportado oficialmente (JRuby >= 1.6.
|
1716
|
+
JRuby es soportado oficialmente (JRuby >= 1.6.1). No se conocen
|
1846
1717
|
problemas con librerías de plantillas de terceras partes. Sin
|
1847
1718
|
embargo, si elegís usar JRuby, deberías examinar sus Rack handlers
|
1848
1719
|
porque el servidor web Thin no es soportado completamente. El
|
1849
1720
|
soporte de JRuby para extensiones C se encuentra en una etapa
|
1850
|
-
experimental, sin embargo, de momento
|
1721
|
+
experimental, sin embargo, de momento solamente RDiscount y Redcarpted
|
1722
|
+
se ven afectadas.
|
1851
1723
|
|
1852
|
-
<b>Hemos dejado de soportar Ruby 1.8.6.</b>
|
1724
|
+
<b>Hemos dejado de soportar Ruby 1.8.6.</b> Si querés ejecutar Sinatra sobre
|
1725
|
+
1.8.6, podés utilizar la versión 1.2, pero tené en cuenta que una vez que
|
1726
|
+
Sinatra 1.4.0 sea liberado, ya no se corregirán los reportes de errores que se
|
1727
|
+
reciban.
|
1853
1728
|
|
1854
1729
|
Siempre le prestamos atención a las nuevas versiones de Ruby.
|
1855
1730
|
|
@@ -1859,7 +1734,6 @@ oficialmente. De cualquier manera, pueden ejecutar Sinatra:
|
|
1859
1734
|
* Versiones anteriores de JRuby y Rubinius
|
1860
1735
|
* MacRuby, Maglev e IronRuby
|
1861
1736
|
* Ruby 1.9.0 y 1.9.1
|
1862
|
-
* Ruby 1.8.6 con {backports}[https://github.com/marcandre/backports/#readme]
|
1863
1737
|
|
1864
1738
|
No estar soportada oficialmente, significa que si las cosas solamente se rompen
|
1865
1739
|
ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
|
@@ -1952,6 +1826,9 @@ siguiendo las especificaciones SemVer y SemVerTag.
|
|
1952
1826
|
* {Twitter}[http://twitter.com/sinatra]
|
1953
1827
|
* {Lista de Correo}[http://groups.google.com/group/sinatrarb/topics]
|
1954
1828
|
* {IRC: #sinatra}[irc://chat.freenode.net/#sinatra] en http://freenode.net
|
1829
|
+
* {Sinatra Book}[http://sinatra-book.gittr.com] Tutorial (en inglés).
|
1830
|
+
* {Sinatra Book Contrib}[http://sinatra-book-contrib.com/] Recetas contribuidas
|
1831
|
+
por la comunidad (en inglés).
|
1955
1832
|
* Documentación de la API para la
|
1956
1833
|
{última versión liberada}[http://rubydoc.info/gems/sinatra] o para la
|
1957
1834
|
{rama de desarrollo actual}[http://rubydoc.info/github/sinatra/sinatra]
|