sinatra 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sinatra might be problematic. Click here for more details.

data/README.es.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Sinatra
2
2
 
3
- *Atención: Este documento es una traducción de la versión en inglés y puede estar desactualizado.*
3
+ [![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](http://travis-ci.org/sinatra/sinatra)
4
4
 
5
5
  Sinatra es un
6
6
  [DSL](https://es.wikipedia.org/wiki/Lenguaje_específico_del_dominio) para
@@ -15,16 +15,116 @@ get '/' do
15
15
  end
16
16
  ```
17
17
 
18
- Instalar la gema y correr la aplicación con:
18
+ Instala la gema:
19
19
 
20
20
  ```shell
21
21
  gem install sinatra
22
22
  ruby miapp.rb
23
23
  ```
24
24
 
25
+ Y corre la aplicación:
26
+ ```shell
27
+ gem install sinatra
28
+ ruby miapp.rb
29
+ ```
30
+
25
31
  Ver en [http://localhost:4567](http://localhost:4567).
26
32
 
27
- Se recomienda ejecutar `gem install thin`, porque Sinatra lo utilizará si está disponible.
33
+ El código que cambiaste no tendra efecto hasta que reinicies el servidor.
34
+ Por favor reinicia el servidor cada vez que cambies tu código o usa [sinatra/reloader](http://www.sinatrarb.com/contrib/reloader).
35
+
36
+ Se recomienda ejecutar `gem install puma`, porque Sinatra lo utilizará si está disponible.
37
+
38
+
39
+ ## Tabla de Contenidos
40
+
41
+ * [Sinatra](#sinatra)
42
+ * [Tabla de Contenidos](#tabla-de-contenidos)
43
+ * [Rutas](#rutas)
44
+ * [Condiciones](#condiciones)
45
+ * [Valores de Retorno](#valores-de-retorno)
46
+ * [Comparadores de Rutas Personalizados](#comparadores-de-rutas-personalizados)
47
+ * [Archivos Estáticos](#archivos-estáticos)
48
+ * [Vistas / Plantillas](#vistas--plantillas)
49
+ * [Plantillas Literales](#plantillas-literales)
50
+ * [Lenguajes de Plantillas Disponibles](#lenguajes-de-plantillas-disponibles)
51
+ * [Plantillas Haml](#plantillas-haml)
52
+ * [Plantillas Erb](#plantillas-erb)
53
+ * [Plantillas Builder](#plantillas-builder)
54
+ * [Plantillas Nokogiri](#plantillas-nokogiri)
55
+ * [Plantillas Sass](#plantillas-sass)
56
+ * [Plantillas SCSS](#plantillas-scss)
57
+ * [Plantillas Less](#plantillas-less)
58
+ * [Plantillas Liquid](#plantillas-liquid)
59
+ * [Plantillas Markdown](#plantillas-markdown)
60
+ * [Plantillas Textile](#plantillas-textile)
61
+ * [Plantillas RDoc](#plantillas-rdoc)
62
+ * [Plantillas AsciiDoc](#plantillas-asciidoc)
63
+ * [Plantillas Radius](#plantillas-radius)
64
+ * [Plantillas Markaby](#plantillas-markaby)
65
+ * [Plantillas RABL](#plantillas-rabl)
66
+ * [Plantillas Slim](#plantillas-slim)
67
+ * [Plantillas Creole](#plantillas-creole)
68
+ * [Plantillas MediaWiki](#mediawiki-templates)
69
+ * [Plantillas CofeeScript](#plantillas-coffeescript)
70
+ * [Plantillas Stylus](#plantillas-stylus)
71
+ * [Plantillas Yajl](#plantillas-yajl)
72
+ * [Plantillas Wlang](#plantillas-wlang)
73
+ * [Accediendo Variables en Plantillas](#accediendo-a-variables-en-plantillas)
74
+ * [Plantillas con `yield` y `layout` anidado](#plantillas-con-yield-y-layout-anidado)
75
+ * [Plantillas Inline](#plantillas-inline)
76
+ * [Plantillas Nombradas](#plantillas-nombradas)
77
+ * [Asociando Extensiones de Archivo](#asociando-extensiones-de-archivo)
78
+ * [Añadiendo Tu Propio Motor de Plantillas](#añadiendo-tu-propio-motor-de-plantillas)
79
+ * [Usando Lógica Personalizada para la Búsqueda en Plantillas](#usando-lógica-personalizada-para-la-búsqueda-en-plantillas)
80
+ * [Filtros](#filtros)
81
+ * [Helpers](#helpers)
82
+ * [Usando Sesiones](#usando-sesiones)
83
+ * [Secreto de Sesión](#secreto-de-sesión)
84
+ * [Configuración de Sesión](#configuración-de-sesión)
85
+ * [Escogiendo tu propio Middleware de Sesión](#escogiendo-tu-propio-middleware-de-sesión)
86
+ * [Interrupcion](#interrupción)
87
+ * [Paso](#paso)
88
+ * [Desencadenando Otra Ruta](#desencadenando-otra-ruta)
89
+ * [Configurando el Cuerpo, Código de Estado y los Encabezados](#configurando-el-cuerpo-código-de-estado-y-los-encabezados)
90
+ * [Streaming De Respuestas](#streaming-de-respuestas)
91
+ * [Logging](#logging)
92
+ * [Tipos Mime](#tipos-mime)
93
+ * [Generando URLs](#generando-urls)
94
+ * [Redirección del Navegador](#redirección-del-navegador)
95
+ * [Control del Cache](#control-del-cache)
96
+ * [Enviando Archivos](#enviando-archivos)
97
+ * [Accediendo al Objeto Request](#accediendo-al-objeto-request)
98
+ * [Archivos Adjuntos](#archivos-adjuntos)
99
+ * [Fecha y Hora](#fecha-y-hora)
100
+ * [Buscando los Archivos de las Plantillas](#buscando-los-archivos-de-las-plantillas)
101
+ * [Configuración](#configuración)
102
+ * [Configurando la Protección Contra Ataques](#configurando-la-protección-contra-ataques)
103
+ * [Configuraciones Disponibles](#configuraciones-disponibles)
104
+ * [Entornos](#entornos)
105
+ * [Manejo de Errores](#manejo-de-errores)
106
+ * [Not Found](#not-found)
107
+ * [Error](#error)
108
+ * [Rack Middleware](#rack-middleware)
109
+ * [Pruebas](#pruebas)
110
+ * [Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares](#sinatrabase---middleware-librerías-y-aplicaciones-modulares)
111
+ * [Estilo Modular vs Estilo Clásico](#estilo-modular-vs-clásico)
112
+ * [Sirviendo una Aplicación Modular](#sirviendo-una-aplicación-modular)
113
+ * [Usando una Aplicación de Estilo Clásico con config.ru](#usando-una-aplicación-clásica-con-un-archivo-configru)
114
+ * [¿Cuándo usar config.ru?](#cuándo-usar-configru)
115
+ * [Utilizando Sinatra como Middleware](#utilizando-sinatra-como-middleware)
116
+ * [Creación Dinámica de Aplicaciones](#creación-dinámica-de-aplicaciones)
117
+ * [Ámbitos y Ligaduras (Scopes and Binding)](#Ámbitos-y-ligaduras)
118
+ * [Alcance de una Aplicación/Clase](#Ámbito-de-aplicaciónclase)
119
+ * [Alcance de una Solicitud/Instancia](#Ámbito-de-peticióninstancia)
120
+ * [Alcance de Delegación](#Ámbito-de-delegación)
121
+ * [Línea de comandos](#línea-de-comandos)
122
+ * [Multi-threading](#multi-threading)
123
+ * [Requerimientos](#requerimientos)
124
+ * [A la Vanguardia](#a-la-vanguardia)
125
+ * [Usando bundler](#usando-bundler)
126
+ * [Versionado](#versionado)
127
+ * [Lecturas Recomendadas](#lecturas-recomendadas)
28
128
 
29
129
  ## Rutas
30
130
 
@@ -67,11 +167,21 @@ end
67
167
  ```
68
168
 
69
169
  Las rutas son comparadas en el orden en el que son definidas. La primera ruta
70
- que coincide con la petición es escogida.
170
+ que coincide con la petición es invocada.
171
+
172
+ Las rutas con barras al final son distintas a las que no tienen:
173
+
174
+
175
+ ```ruby
176
+ get '/foo' do
177
+ # no es igual que "GET /foo/"
178
+ end
179
+ ```
71
180
 
72
181
  Los patrones de las rutas pueden incluir parámetros nombrados, accesibles a
73
182
  través del hash `params`:
74
183
 
184
+
75
185
  ```ruby
76
186
  get '/hola/:nombre' do
77
187
  # coincide con "GET /hola/foo" y "GET /hola/bar"
@@ -110,7 +220,7 @@ O, con parámetros de bloque:
110
220
 
111
221
  ```ruby
112
222
  get '/descargar/*.*' do |path, ext|
113
- [path, ext] # => ["path/al/archivo", "xml"]
223
+ [path, ext] # => ["path/to/file", "xml"]
114
224
  end
115
225
  ```
116
226
 
@@ -139,10 +249,31 @@ get '/posts/:formato?' do
139
249
  end
140
250
  ```
141
251
 
252
+ Las rutas también pueden usar parámetros de consulta:
253
+
254
+ ```ruby
255
+ get '/posts' do
256
+ # es igual que "GET /posts?title=foo&author=bar"
257
+ title = params['title']
258
+ author = params['author']
259
+ # usa las variables title y author; la consulta es opcional para la ruta /posts
260
+ end
261
+ ```
262
+
142
263
  A propósito, a menos que desactives la protección para el ataque *path
143
- traversal* (ver más abajo), el path de la petición puede ser modificado
264
+ traversal* (ver más [abajo](#configurando-la-protección-contra-ataques)), el path de la petición puede ser modificado
144
265
  antes de que se compare con los de tus rutas.
145
266
 
267
+ Puedes perzonalizar las opciones de [Mustermann](https://github.com/sinatra/mustermann) usadas para una ruta pasando
268
+ el hash `:mustermann_opts`:
269
+
270
+ ```ruby
271
+ get '\A/posts\z', :mustermann_opts => { :type => :regexp, :check_anchors => false } do
272
+ # es exactamente igual a /posts, con anclaje explícito
273
+ "¡Si igualas un patrón anclado aplaude!"
274
+ end
275
+ ```
276
+
146
277
  ## Condiciones
147
278
 
148
279
  Las rutas pueden incluir una variedad de condiciones de selección, como por
@@ -174,6 +305,9 @@ get '/', :provides => ['rss', 'atom', 'xml'] do
174
305
  end
175
306
  ```
176
307
 
308
+ `provides` busca el encabezado Accept de la solicitud
309
+
310
+
177
311
  Puede definir sus propias condiciones fácilmente:
178
312
 
179
313
  ```ruby
@@ -188,12 +322,10 @@ get '/gana_un_auto' do
188
322
  end
189
323
  ```
190
324
 
191
- Si su condición acepta más de un argumento, puede pasarle un arreglo. Al
192
- definir la condición, se puede utilizar el operador splat en
193
- la lista de parámetros:
325
+ Para una condición que toma multiples valores usa splat:
194
326
 
195
327
  ```ruby
196
- set(:autorizar) do |*roles| # <- mirá el splat
328
+ set(:autorizar) do |*roles| # <- mira el splat
197
329
  condition do
198
330
  unless sesion_iniciada? && roles.any? {|rol| usuario_actual.tiene_rol? rol }
199
331
  redirect "/iniciar_sesion/", 303
@@ -210,25 +342,26 @@ get "/solo/administradores/", :autorizar => :administrador do
210
342
  end
211
343
  ```
212
344
 
213
- ### Valores de Retorno
345
+ ## Valores de Retorno
214
346
 
215
- El valor de retorno de un bloque de ruta que determina al menos el cuerpo de la
216
- respuesta que se le pasa al cliente HTTP o al siguiente middleware en la pila
217
- de Rack. Lo más común es que sea un string, como en los ejemplos anteriores.
347
+ El valor de retorno de un bloque de ruta determina por lo menos el cuerpo de la respuesta
348
+ transmitida al cliente HTTP o por lo menos al siguiente middleware en la pila de Rack.
349
+ Lo más común es que sea un string, como en los ejemplos anteriores.
218
350
  Sin embargo, otros valores también son aceptados.
219
351
 
220
- Puede devolver cualquier objeto que sea una respuesta Rack válida, un objeto
221
- que represente el cuerpo de una respuesta Rack o un código de estado HTTP:
352
+ Puedes retornar cualquier objeto que sea una respuesta Rack válida,
353
+ un objeto que represente el cuerpo de una respuesta Rack o un código
354
+ de estado HTTP:
222
355
 
223
- * Un arreglo con tres elementos: `[estado (Fixnum), cabeceras (Hash), cuerpo de
356
+ * Un arreglo con tres elementos: `[estado (Integer), cabeceras (Hash), cuerpo de
224
357
  la respuesta (responde a #each)]`
225
- * Un arreglo con dos elementos: `[estado (Fixnum), cuerpo de la respuesta
358
+ * Un arreglo con dos elementos: `[estado (Integer), cuerpo de la respuesta
226
359
  (responde a #each)]`
227
360
  * Un objeto que responde a `#each` y que le pasa únicamente strings al bloque
228
361
  dado
229
- * Un Fixnum representando el código de estado
362
+ * Un Integer representando el código de estado
230
363
 
231
- De esa manera, podemos fácilmente implementar un ejemplo de streaming:
364
+ De esa manera, por ejemplo, podemos fácilmente implementar un ejemplo de streaming:
232
365
 
233
366
  ```ruby
234
367
  class Stream
@@ -240,14 +373,17 @@ end
240
373
  get('/') { Stream.new }
241
374
  ```
242
375
 
243
- ### Comparadores de Rutas Personalizados
376
+ También puedes usar el `stream` helper ([descrito abajo](#streaming-de-respuestas))
377
+ para reducir el código repetitivo e incrustar la lógica de stream a la ruta
378
+
379
+ ## Comparadores de Rutas Personalizados
244
380
 
245
381
  Como se mostró anteriormente, Sinatra permite utilizar strings y expresiones
246
- regulares para definir las rutas. Sin embargo, la cosa no termina ahí. Podés
382
+ regulares para definir las rutas. Sin embargo, no termina ahí.Puedes
247
383
  definir tus propios comparadores muy fácilmente:
248
384
 
249
385
  ```ruby
250
- class PatronCualquieraMenos
386
+ class TodoMenosElPatron
251
387
  Match = Struct.new(:captures)
252
388
 
253
389
  def initialize(excepto)
@@ -261,7 +397,7 @@ class PatronCualquieraMenos
261
397
  end
262
398
 
263
399
  def cualquiera_menos(patron)
264
- PatronCualquieraMenos.new(patron)
400
+ TodoMenosElPatron.new(patron)
265
401
  end
266
402
 
267
403
  get cualquiera_menos("/index") do
@@ -279,7 +415,7 @@ get // do
279
415
  end
280
416
  ```
281
417
 
282
- O, usando un lookahead negativo:
418
+ O, usando un look ahead negativo:
283
419
 
284
420
  ```ruby
285
421
  get %r{(?!/index)} do
@@ -287,14 +423,14 @@ get %r{(?!/index)} do
287
423
  end
288
424
  ```
289
425
 
290
- ### Archivos Estáticos
426
+ ## Archivos Estáticos
291
427
 
292
428
  Los archivos estáticos son servidos desde el directorio público
293
429
  `./public`. Puede especificar una ubicación diferente ajustando la
294
430
  opción `:public_folder`:
295
431
 
296
432
  ```ruby
297
- set :public_folder, File.dirname(__FILE__) + '/estaticos'
433
+ set :public_folder, __dir__ + '/static'
298
434
  ```
299
435
 
300
436
  Note que el nombre del directorio público no está incluido en la URL. Por
@@ -302,9 +438,9 @@ ejemplo, el archivo `./public/css/style.css` se accede a través de
302
438
  `http://ejemplo.com/css/style.css`.
303
439
 
304
440
  Use la configuración `:static_cache_control` para agregar el encabezado
305
- `Cache-Control` (ver la sección de configuración para más detalles).
441
+ `Cache-Control` (Ver mas [abajo](#control-del-cache)).
306
442
 
307
- ### Vistas / Plantillas
443
+ ## Vistas / Plantillas
308
444
 
309
445
  Cada lenguaje de plantilla se expone a través de un método de renderizado que
310
446
  lleva su nombre. Estos métodos simplemente devuelven un string:
@@ -317,7 +453,7 @@ end
317
453
 
318
454
  Renderiza `views/index.erb`.
319
455
 
320
- En lugar del nombre de la plantilla podés proporcionar directamente el
456
+ En lugar del nombre de la plantilla puedes proporcionar directamente el
321
457
  contenido de la misma:
322
458
 
323
459
  ```ruby
@@ -389,7 +525,7 @@ Opciones disponibles:
389
525
  <dt>layout</dt>
390
526
  <dd>
391
527
  Si es <tt>true</tt> o <tt>false</tt> indica que se debe usar, o no, un layout,
392
- respectivamente. También puede ser un símbolo que especifique qué plantilla
528
+ respectivamente. También puede ser un Symbol que especifique qué plantilla
393
529
  usar. Ejemplo: <tt>erb :index, :layout => !request.xhr?</tt>
394
530
  </dd>
395
531
 
@@ -402,7 +538,7 @@ Opciones disponibles:
402
538
  <dt>scope</dt>
403
539
  <dd>
404
540
  Ámbito en el que se renderiza la plantilla. Por defecto utiliza la instancia
405
- de la aplicación. Tené en cuenta que si cambiás esta opción las variables de
541
+ de la aplicación. Ten en cuenta que si cambiás esta opción las variables de
406
542
  instancia y los helpers van a dejar de estar disponibles.
407
543
  </dd>
408
544
 
@@ -413,22 +549,45 @@ Opciones disponibles:
413
549
  del motor usado para renderizar la plantilla.
414
550
  Ejemplo: <tt>set :rdoc, :layout_engine => :erb</tt>
415
551
  </dd>
416
-
417
- <dd>
418
- Se asume que las plantillas están ubicadas directamente bajo el directorio
419
- <tt>./views</tt>. Para usar un directorio de vistas diferente:
420
- <tt>set :views, settings.root + '/plantillas'</tt>
421
- </dd>
422
-
552
+
553
+ <dt>layout_options</dt>
423
554
  <dd>
424
- Es importante acordarse que siempre tenés que referenciar a las plantillas con
425
- símbolos, incluso cuando se encuentran en un subdirectorio (en este caso
426
- tenés que usar: `:'subdir/plantilla'` o `'subdir/plantilla'.to_sym`). Tenés que
427
- usar un símbolo porque los métodos de renderización van a renderizar
428
- directamente cualquier string que se les pase como argumento.
555
+ Opciones especiales usadas únicamente para renderizar el layout. Ejemplo:
556
+ <tt>set :rdoc, :layout_options => { :views => 'views/layouts' }</tt>
429
557
  </dd>
430
558
  </dl>
431
559
 
560
+ Se asume que las plantillas están ubicadas directamente bajo el directorio `./views`.
561
+ Para usar un directorio diferente:
562
+
563
+ ```ruby
564
+ set :views, settings.root + '/templates'
565
+ ```
566
+
567
+ Es importante acordarse que siempre tienes que referenciar a las plantillas con
568
+ símbolos, incluso cuando se encuentran en un subdirectorio (en este caso
569
+ tienes que usar: `:'subdir/plantilla'` o `'subdir/plantilla'.to_sym`). Esto es debido
570
+ a que los métodos de renderización van a renderizar directamente cualquier string que
571
+ se les pase como argumento.
572
+
573
+ ### Plantillas Literales
574
+
575
+ ```ruby
576
+ get '/' do
577
+ haml '%div.titulo Hola Mundo'
578
+ end
579
+ ```
580
+
581
+ Renderiza el string de la plantilla. Opcionalmente puedes especificar
582
+ `:path` y `:line` para un backtrace más claro si hay una ruta del sistema
583
+ de archivos o una línea asociada con ese string
584
+
585
+ ```ruby
586
+ get '/' do
587
+ haml '%div.titulo Hola Mundo', :path => 'ejemplos/archivo.haml', :line => 3
588
+ end
589
+ ```
590
+
432
591
  ### Lenguajes de Plantillas Disponibles
433
592
 
434
593
  Algunos lenguajes tienen varias implementaciones. Para especificar que
@@ -440,7 +599,7 @@ require 'rdiscount' # o require 'bluecloth'
440
599
  get('/') { markdown :index }
441
600
  ```
442
601
 
443
- ### Plantillas Haml
602
+ #### Plantillas Haml
444
603
 
445
604
  <table>
446
605
  <tr>
@@ -457,7 +616,7 @@ get('/') { markdown :index }
457
616
  </tr>
458
617
  </table>
459
618
 
460
- ### Plantillas Erb
619
+ #### Plantillas Erb
461
620
 
462
621
  <table>
463
622
  <tr>
@@ -477,7 +636,7 @@ get('/') { markdown :index }
477
636
  </tr>
478
637
  </table>
479
638
 
480
- ### Plantillas Builder
639
+ #### Plantillas Builder
481
640
 
482
641
  <table>
483
642
  <tr>
@@ -496,9 +655,9 @@ get('/') { markdown :index }
496
655
  </tr>
497
656
  </table>
498
657
 
499
- Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
658
+ También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
500
659
 
501
- ### Plantillas Nokogiri
660
+ #### Plantillas Nokogiri
502
661
 
503
662
  <table>
504
663
  <tr>
@@ -515,9 +674,9 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
515
674
  </tr>
516
675
  </table>
517
676
 
518
- Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
677
+ También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
519
678
 
520
- ### Plantillas Sass
679
+ #### Plantillas Sass
521
680
 
522
681
  <table>
523
682
  <tr>
@@ -534,7 +693,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
534
693
  </tr>
535
694
  </table>
536
695
 
537
- ### Plantillas SCSS
696
+ #### Plantillas SCSS
538
697
 
539
698
  <table>
540
699
  <tr>
@@ -551,7 +710,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
551
710
  </tr>
552
711
  </table>
553
712
 
554
- ### Plantillas Less
713
+ #### Plantillas Less
555
714
 
556
715
  <table>
557
716
  <tr>
@@ -568,12 +727,12 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
568
727
  </tr>
569
728
  </table>
570
729
 
571
- ### Plantillas Liquid
730
+ #### Plantillas Liquid
572
731
 
573
732
  <table>
574
733
  <tr>
575
734
  <td>Dependencias</td>
576
- <td><a href="http://liquidmarkup.org/" title="liquid">liquid</a></td>
735
+ <td><a href="https://shopify.github.io/liquid/" title="liquid">liquid</a></td>
577
736
  </tr>
578
737
  <tr>
579
738
  <td>Extensiones de Archivo</td>
@@ -588,7 +747,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
588
747
  Como no va a poder llamar a métodos de Ruby (excepto por `yield`) desde una
589
748
  plantilla Liquid, casi siempre va a querer pasarle locales.
590
749
 
591
- ### Plantillas Markdown
750
+ #### Plantillas Markdown
592
751
 
593
752
  <table>
594
753
  <tr>
@@ -596,7 +755,7 @@ plantilla Liquid, casi siempre va a querer pasarle locales.
596
755
  <td>
597
756
  <a href="https://github.com/davidfstr/rdiscount" title="RDiscount">RDiscount</a>,
598
757
  <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
599
- <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
758
+ <a href="https://github.com/ged/bluecloth" title="bluecloth">BlueCloth</a>,
600
759
  <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a> o
601
760
  <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
602
761
  </td>
@@ -618,7 +777,7 @@ generalmente va a usarlo en combinación con otro motor de renderizado:
618
777
  erb :resumen, :locals => { :texto => markdown(:introduccion) }
619
778
  ```
620
779
 
621
- Tenga en cuenta que también podés llamar al método `markdown` desde otras
780
+ Tenga en cuenta que también puedes llamar al método `markdown` desde otras
622
781
  plantillas:
623
782
 
624
783
  ```ruby
@@ -630,7 +789,7 @@ Como no puede utilizar Ruby desde Markdown, no puede usar layouts escritos en
630
789
  Markdown. De todos modos, es posible usar un motor de renderizado para el
631
790
  layout distinto al de la plantilla pasando la opción `:layout_engine`.
632
791
 
633
- ### Plantillas Textile
792
+ #### Plantillas Textile
634
793
 
635
794
  <table>
636
795
  <tr>
@@ -654,7 +813,7 @@ generalmente vas a usarlo en combinación con otro motor de renderizado:
654
813
  erb :resumen, :locals => { :texto => textile(:introduccion) }
655
814
  ```
656
815
 
657
- Tené en cuenta que también podés llamar al método `textile` desde otras
816
+ Ten en cuenta que también puedes llamar al método `textile` desde otras
658
817
  plantillas:
659
818
 
660
819
  ```ruby
@@ -662,11 +821,11 @@ plantillas:
662
821
  %p= textile(:saludos)
663
822
  ```
664
823
 
665
- Como no podés utilizar Ruby desde Textile, no podés usar layouts escritos en
824
+ Como no puedes utilizar Ruby desde Textile, no puedes usar layouts escritos en
666
825
  Textile. De todos modos, es posible usar un motor de renderizado para el
667
826
  layout distinto al de la plantilla pasando la opción `:layout_engine`.
668
827
 
669
- ### Plantillas RDoc
828
+ #### Plantillas RDoc
670
829
 
671
830
  <table>
672
831
  <tr>
@@ -690,7 +849,7 @@ generalmente vas a usarlo en combinación con otro motor de renderizado:
690
849
  erb :resumen, :locals => { :texto => rdoc(:introduccion) }
691
850
  ```
692
851
 
693
- Tené en cuenta que también podés llamar al método `rdoc` desde otras
852
+ Ten en cuenta que también puedes llamar al método `rdoc` desde otras
694
853
  plantillas:
695
854
 
696
855
  ```ruby
@@ -698,11 +857,31 @@ plantillas:
698
857
  %p= rdoc(:saludos)
699
858
  ```
700
859
 
701
- Como no podés utilizar Ruby desde RDoc, no podés usar layouts escritos en RDoc.
860
+ Como no puedes utilizar Ruby desde RDoc, no puedes usar layouts escritos en RDoc.
702
861
  De todos modos, es posible usar un motor de renderizado para el layout distinto
703
862
  al de la plantilla pasando la opción `:layout_engine`.
704
863
 
705
- ### Plantillas Radius
864
+ #### Plantillas AsciiDoc
865
+
866
+ <table>
867
+ <tr>
868
+ <td>Dependencia</td>
869
+ <td><a href="http://asciidoctor.org/" title="Asciidoctor">Asciidoctor</a></td>
870
+ </tr>
871
+ <tr>
872
+ <td>Extensiones de Archivo</td>
873
+ <td><tt>.asciidoc</tt>, <tt>.adoc</tt> and <tt>.ad</tt></td>
874
+ </tr>
875
+ <tr>
876
+ <td>Ejemplo</td>
877
+ <td><tt>asciidoc :README, :layout_engine => :erb</tt></td>
878
+ </tr>
879
+ </table>
880
+
881
+ Desde que no se puede utilizar métodos de Ruby desde una
882
+ plantilla AsciiDoc, casi siempre va a querer pasarle locales.
883
+
884
+ #### Plantillas Radius
706
885
 
707
886
  <table>
708
887
  <tr>
@@ -722,7 +901,7 @@ al de la plantilla pasando la opción `:layout_engine`.
722
901
  Desde que no se puede utilizar métodos de Ruby (excepto por `yield`) de una
723
902
  plantilla Radius, casi siempre se necesita pasar locales.
724
903
 
725
- ### Plantillas Markaby
904
+ #### Plantillas Markaby
726
905
 
727
906
  <table>
728
907
  <tr>
@@ -739,9 +918,9 @@ plantilla Radius, casi siempre se necesita pasar locales.
739
918
  </tr>
740
919
  </table>
741
920
 
742
- Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
921
+ También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
743
922
 
744
- ### Plantillas RABL
923
+ #### Plantillas RABL
745
924
 
746
925
  <table>
747
926
  <tr>
@@ -758,7 +937,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
758
937
  </tr>
759
938
  </table>
760
939
 
761
- ### Plantillas Slim
940
+ #### Plantillas Slim
762
941
 
763
942
  <table>
764
943
  <tr>
@@ -775,7 +954,7 @@ Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
775
954
  </tr>
776
955
  </table>
777
956
 
778
- ### Plantillas Creole
957
+ #### Plantillas Creole
779
958
 
780
959
  <table>
781
960
  <tr>
@@ -807,11 +986,45 @@ plantillas:
807
986
  %p= creole(:saludos)
808
987
  ```
809
988
 
810
- Como no podés utilizar Ruby desde Creole, no podés usar layouts escritos en
989
+ Como no puedes utilizar Ruby desde Creole, no puedes usar layouts escritos en
811
990
  Creole. De todos modos, es posible usar un motor de renderizado para el layout
812
991
  distinto al de la plantilla pasando la opción `:layout_engine`.
813
992
 
814
- ### Plantillas CoffeeScript
993
+ #### MediaWiki Templates
994
+
995
+ <table>
996
+ <tr>
997
+ <td>Dependencia</td>
998
+ <td><a href="https://github.com/nricciar/wikicloth" title="WikiCloth">WikiCloth</a></td>
999
+ </tr>
1000
+ <tr>
1001
+ <td>Extension de Archivo</td>
1002
+ <td><tt>.mediawiki</tt> and <tt>.mw</tt></td>
1003
+ </tr>
1004
+ <tr>
1005
+ <td>Ejemplo</td>
1006
+ <td><tt>mediawiki :wiki, :layout_engine => :erb</tt></td>
1007
+ </tr>
1008
+ </table>
1009
+
1010
+ No es posible llamar métodos desde el markup de MediaWiki, ni pasar locales al mismo.
1011
+ Por lo tanto usualmente lo usarás en combinación con otro motor de renderizado:
1012
+
1013
+ ```ruby
1014
+ erb :overview, :locals => { :text => mediawiki(:introduction) }
1015
+ ```
1016
+
1017
+ Nota que también puedes llamar al método `mediawiki` desde dentro de otras plantillas:
1018
+
1019
+ ```ruby
1020
+ %h1 Hello From Haml!
1021
+ %p= mediawiki(:greetings)
1022
+ ```
1023
+
1024
+ Debido a que no puedes llamar a Ruby desde MediaWiki, no puedes usar los diseños escritos en MediaWiki.
1025
+ De todas maneras, es posible usar otro motor de renderizado para esa plantilla pasando la opción :layout_engine.
1026
+
1027
+ #### Plantillas CoffeeScript
815
1028
 
816
1029
  <table>
817
1030
  <tr>
@@ -835,7 +1048,7 @@ distinto al de la plantilla pasando la opción `:layout_engine`.
835
1048
  </tr>
836
1049
  </table>
837
1050
 
838
- ### Plantillas Stylus
1051
+ #### Plantillas Stylus
839
1052
 
840
1053
  <table>
841
1054
  <tr>
@@ -859,7 +1072,19 @@ distinto al de la plantilla pasando la opción `:layout_engine`.
859
1072
  </tr>
860
1073
  </table>
861
1074
 
862
- ### Plantillas Yajl
1075
+ Antes de poder usar las plantillas de Stylus, necesitas cargar `stylus` y `stylus/tilt`:
1076
+
1077
+ ```ruby
1078
+ require 'sinatra'
1079
+ require 'stylus'
1080
+ require 'stylus/tilt'
1081
+
1082
+ get '/' do
1083
+ stylus :example
1084
+ end
1085
+ ```
1086
+
1087
+ #### Plantillas Yajl
863
1088
 
864
1089
  <table>
865
1090
  <tr>
@@ -893,10 +1118,11 @@ json[:baz] = key
893
1118
  Las opciones `:callback` y `:variable` se pueden utilizar para decorar el objeto renderizado:
894
1119
 
895
1120
  ```ruby
896
- var resource = {"foo":"bar","baz":"qux"}; present(resource);
1121
+ var contenido = {"foo":"bar","baz":"qux"};
1122
+ present(contenido);
897
1123
  ```
898
1124
 
899
- ### Plantillas WLang
1125
+ #### Plantillas WLang
900
1126
 
901
1127
  <table>
902
1128
  <tr>
@@ -916,16 +1142,6 @@ var resource = {"foo":"bar","baz":"qux"}; present(resource);
916
1142
  Como no vas a poder llamar a métodos de Ruby (excepto por `yield`) desde una
917
1143
  plantilla WLang, casi siempre vas a querer pasarle locales.
918
1144
 
919
- ### Plantillas Embebidas
920
-
921
- ```ruby
922
- get '/' do
923
- haml '%div.titulo Hola Mundo'
924
- end
925
- ```
926
-
927
- Renderiza el template embebido en el string.
928
-
929
1145
  ### Accediendo a Variables en Plantillas
930
1146
 
931
1147
  Las plantillas son evaluadas dentro del mismo contexto que los manejadores de
@@ -951,12 +1167,46 @@ end
951
1167
  Esto es usado típicamente cuando se renderizan plantillas como parciales desde
952
1168
  adentro de otras plantillas.
953
1169
 
1170
+ ### Plantillas con `yield` y `layout` anidado
1171
+
1172
+ Un layout es usualmente una plantilla que llama a `yield`.
1173
+ Dicha plantilla puede ser usada tanto a travé de la opción `:template`
1174
+ como describimos arriba, o puede ser rederizada con un bloque como a
1175
+ continuación:
1176
+
1177
+ ```ruby
1178
+ erb :post, :layout => false do
1179
+ erb :index
1180
+ end
1181
+ ```
1182
+ Este código es principalmente equivalente a `erb :index, :layout => :post`.
1183
+
1184
+ Pasar bloques a métodos de renderizado es la forma mas útil de crear layouts anidados:
1185
+
1186
+ ```ruby
1187
+ erb :main_layout, :layout => false do
1188
+ erb :admin_layout do
1189
+ erb :user
1190
+ end
1191
+ end
1192
+ ```
1193
+
1194
+ Esto también se puede hacer en menos líneas de código con:
1195
+
1196
+ ```ruby
1197
+ erb :admin_layout, :layout => :main_layout do
1198
+ erb :user
1199
+ end
1200
+ ```
1201
+
1202
+ Actualmente, los siguientes métodos de renderizado aceptan un bloque: `erb`, `haml`,
1203
+ `liquid`, `slim `, `wlang`. También el método general de `render` acepta un bloque.
1204
+
954
1205
  ### Plantillas Inline
955
1206
 
956
1207
  Las plantillas pueden ser definidas al final del archivo fuente:
957
1208
 
958
1209
  ```ruby
959
- require 'rubygems'
960
1210
  require 'sinatra'
961
1211
 
962
1212
  get '/' do
@@ -970,12 +1220,12 @@ __END__
970
1220
  = yield
971
1221
 
972
1222
  @@ index
973
- %div.titulo Hola mundo!!!!!
1223
+ %div.titulo Hola Mundo
974
1224
  ```
975
1225
 
976
- NOTA: únicamente las plantillas inline definidas en el archivo fuente que
1226
+ NOTA: Únicamente las plantillas inline definidas en el archivo fuente que
977
1227
  requiere Sinatra son cargadas automáticamente. Llamá `enable
978
- :inline_templates` explícitamente si tenés plantillas inline en otros
1228
+ :inline_templates` explícitamente si tienes plantillas inline en otros
979
1229
  archivos fuente.
980
1230
 
981
1231
  ### Plantillas Nombradas
@@ -998,7 +1248,7 @@ end
998
1248
  ```
999
1249
 
1000
1250
  Si existe una plantilla con el nombre "layout", va a ser usada cada vez que
1001
- una plantilla es renderizada. Podés desactivar los layouts individualmente
1251
+ una plantilla es renderizada.Puedes desactivar los layouts individualmente
1002
1252
  pasando `:layout => false` o globalmente con
1003
1253
  `set :haml, :layout => false`:
1004
1254
 
@@ -1010,20 +1260,20 @@ end
1010
1260
 
1011
1261
  ### Asociando Extensiones de Archivo
1012
1262
 
1013
- Para asociar una extensión de archivo con un motor de renderizado, usá
1014
- `Tilt.register`. Por ejemplo, si querés usar la extensión `tt` para
1015
- las plantillas Textile, podés hacer lo siguiente:
1263
+ Para asociar una extensión de archivo con un motor de renderizado, usa
1264
+ `Tilt.register`. Por ejemplo, si quieres usar la extensión `tt` para
1265
+ las plantillas Textile, puedes hacer lo siguiente:
1016
1266
 
1017
1267
  ```ruby
1018
1268
  Tilt.register :tt, Tilt[:textile]
1019
1269
  ```
1020
1270
 
1021
- ### Agregando Tu Propio Motor de Renderizado
1271
+ ### Añadiendo Tu Propio Motor de Plantillas
1022
1272
 
1023
- Primero, registrá tu motor con Tilt, y después, creá tu método de renderizado:
1273
+ Primero, registra tu motor con Tilt, y después, creá tu método de renderizado:
1024
1274
 
1025
1275
  ```ruby
1026
- Tilt.register :mipg, MiMotorParaPlantillaGenial
1276
+ Tilt.register :mipg, MiMotorDePlantilla
1027
1277
 
1028
1278
  helpers do
1029
1279
  def mypg(*args) render(:mypg, *args) end
@@ -1037,6 +1287,23 @@ end
1037
1287
  Renderiza `./views/index.mypg`. Mirá https://github.com/rtomayko/tilt
1038
1288
  para aprender más de Tilt.
1039
1289
 
1290
+ ### Usando Lógica Personalizada para la Búsqueda en Plantillas
1291
+
1292
+ Para implementar tu propio mecanismo de búsqueda de plantillas puedes
1293
+ escribir tu propio método `#find_template`
1294
+
1295
+ ```ruby
1296
+ configure do
1297
+ set :views [ './views/a', './views/b' ]
1298
+ end
1299
+
1300
+ def find_template(views, name, engine, &block)
1301
+ Array(views).each do |v|
1302
+ super(v, name, engine, &block)
1303
+ end
1304
+ end
1305
+ ```
1306
+
1040
1307
  ## Filtros
1041
1308
 
1042
1309
  Los filtros `before` son evaluados antes de cada petición dentro del mismo
@@ -1097,9 +1364,9 @@ after '/blog/*', :host_name => 'ejemplo.com' do
1097
1364
  end
1098
1365
  ```
1099
1366
 
1100
- ## Ayudantes
1367
+ ## Helpers
1101
1368
 
1102
- Usá el método top-level *helpers* para definir métodos ayudantes que
1369
+ Usá el método top-level `helpers` para definir métodos ayudantes (helpers) que
1103
1370
  pueden ser utilizados dentro de los manejadores de rutas y las plantillas:
1104
1371
 
1105
1372
  ```ruby
@@ -1115,7 +1382,7 @@ end
1115
1382
  ```
1116
1383
 
1117
1384
  Por cuestiones organizativas, puede resultar conveniente organizar los métodos
1118
- ayudantes en distintos módulos:
1385
+ helpers en distintos módulos:
1119
1386
 
1120
1387
  ```ruby
1121
1388
  module FooUtils
@@ -1129,7 +1396,7 @@ end
1129
1396
  helpers FooUtils, BarUtils
1130
1397
  ```
1131
1398
 
1132
- El efecto de utilizar *helpers* de esta manera es el mismo que resulta de
1399
+ El efecto de utilizar `helpers` de esta manera es el mismo que resulta de
1133
1400
  incluir los módulos en la clase de la aplicación.
1134
1401
 
1135
1402
  ### Usando Sesiones
@@ -1149,51 +1416,137 @@ get '/:valor' do
1149
1416
  end
1150
1417
  ```
1151
1418
 
1152
- Tené en cuenta que `enable :sessions` guarda todos los datos en una
1153
- cookie, lo cual no es siempre deseable (guardar muchos datos va a incrementar
1154
- el tráfico, por citar un ejemplo). Podés usar cualquier middleware Rack para
1155
- manejar sesiones, de la misma manera que usarías cualquier otro middleware,
1156
- pero con la salvedad de que *no* tenés que llamar a `enable :sessions`:
1419
+ #### Secreto de Sesión
1157
1420
 
1158
- ```ruby
1159
- use Rack::Session::Pool, :expire_after => 2592000
1421
+ Para mejorar la seguridad, los datos de la sesión en la cookie se firman con un secreto usando `HMAC-SHA1`. El secreto de esta sesión debería ser de manera óptima
1422
+ un valor aleatorio criptográficamente seguro de una longitud adecuada para
1423
+ `HMAC-SHA1` que es mayor o igual que 64 bytes (512 bits, 128 hex caracteres).
1424
+ Se le aconsejará que no use un secreto que sea inferior a 32
1425
+ bytes de aleatoriedad (256 bits, 64 caracteres hexadecimales).
1426
+ Por lo tanto, es **muy importante** que no solo invente el secreto,
1427
+ sino que use un generador de números aleatorios para crearlo.
1428
+ Los humanos somos extremadamente malos generando valores aleatorios
1160
1429
 
1161
- get '/' do
1162
- "valor = " << session[:valor].inspect
1163
- end
1430
+ De forma predeterminada, un secreto de sesión aleatorio seguro de 32 bytes se genera para usted por
1431
+ Sinatra, pero cambiará con cada reinicio de su aplicación. Si tienes varias
1432
+ instancias de tu aplicación y dejas que Sinatra genere la clave, cada instancia
1433
+ tendría una clave de sesión diferente y probablemente no es lo que quieres.
1164
1434
 
1165
- get '/:valor' do
1166
- session[:valor] = params['valor']
1167
- end
1435
+ Para una mejor seguridad y usabilidad es
1436
+ [recomendado](https://12factor.net/config) que genere un secreto de sesión
1437
+ aleatorio seguro y se guarde en las variables de entorno en cada host que ejecuta
1438
+ su aplicación para que todas las instancias de su aplicación compartan el mismo
1439
+ secreto. Debería rotar periódicamente esta sesión secreta a un nuevo valor.
1440
+ Aquí hay algunos ejemplos de cómo puede crear un secreto de 64 bytes y configurarlo:
1441
+
1442
+ **Generación de Secreto de Sesión**
1443
+
1444
+ ```text
1445
+ $ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
1446
+ 99ae8af...snip...ec0f262ac
1168
1447
  ```
1169
1448
 
1170
- Para incrementar la seguridad, los datos de la sesión almacenados en
1171
- la cookie son firmados con un secreto de sesión. Este secreto, es
1172
- generado aleatoriamente por Sinatra. De cualquier manera, hay que
1173
- tener en cuenta que cada vez que inicies la aplicación se va a generar
1174
- uno nuevo. Así, si querés que todas las instancias de tu aplicación
1175
- compartan un único secreto, tenés que definirlo vos:
1449
+ **Generación de Secreto de Sesión (Puntos Extras)**
1450
+
1451
+ Usa la [gema sysrandom](https://github.com/cryptosphere/sysrandom) para preferir
1452
+ el uso de el sistema RNG para generar valores aleatorios en lugar de
1453
+ espacio de usuario `OpenSSL` que MRI Ruby tiene por defecto:
1454
+
1455
+ ```text
1456
+ $ gem install sysrandom
1457
+ Building native extensions. This could take a while...
1458
+ Successfully installed sysrandom-1.x
1459
+ 1 gem installed
1460
+
1461
+ $ ruby -e "require 'sysrandom/securerandom'; puts SecureRandom.hex(64)"
1462
+ 99ae8af...snip...ec0f262ac
1463
+ ```
1464
+
1465
+ **Secreto de Sesión en Variable de Entorno**
1466
+
1467
+ Establezca una variable de entorno `SESSION_SECRET` para Sinatra en el valor que
1468
+ generaste. Haz que este valor sea persistente durante los reinicios de su host. El
1469
+ método para hacer esto variará a través de los sistemas operativos, esto es para
1470
+ propósitos ilustrativos solamente:
1471
+
1472
+
1473
+ ```bash
1474
+ # echo "export SESSION_SECRET=99ae8af...snip...ec0f262ac" >> ~/.bashrc
1475
+ ```
1476
+
1477
+ **Configuración de la Aplicación y su Secreto de Sesión**
1478
+
1479
+ Configura tu aplicación a prueba de fallas si la variable de entorno
1480
+ `SESSION_SECRET` no esta disponible
1481
+
1482
+ Para puntos extras usa la [gema sysrandom](https://github.com/cryptosphere/sysrandom) acá tambien:
1176
1483
 
1177
1484
  ```ruby
1178
- set :session_secret, 'super secreto'
1485
+ require 'securerandom'
1486
+ # -or- require 'sysrandom/securerandom'
1487
+ set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
1179
1488
  ```
1180
1489
 
1181
- Si necesitás una configuración más específica, `sessions` acepta un
1182
- Hash con opciones:
1490
+ #### Configuración de Sesión
1491
+
1492
+ Si desea configurarlo más, también puede almacenar un hash con opciones
1493
+ en la configuración `sessions`:
1183
1494
 
1184
1495
  ```ruby
1185
1496
  set :sessions, :domain => 'foo.com'
1186
1497
  ```
1187
1498
 
1499
+ Para compartir su sesión en otras aplicaciones en subdominios de foo.com, agregue el prefijo
1500
+ dominio con un *.* como este en su lugar:
1501
+
1502
+ ```ruby
1503
+ set :sessions, :domain => '.foo.com'
1504
+ ```
1505
+
1506
+ #### Escogiendo tu Propio Middleware de Sesión
1507
+
1508
+ Tenga en cuenta que `enable :sessions` en realidad almacena todos los datos en una cookie.
1509
+ Esto no siempre podria ser lo que quieres (almacenar muchos datos aumentará su
1510
+ tráfico, por ejemplo). Puede usar cualquier middleware de sesión proveniente de Rack
1511
+ para hacerlo, se puede utilizar uno de los siguientes métodos:
1512
+
1513
+ ```ruby
1514
+ enable :sessions
1515
+ set :session_store, Rack::Session::Pool
1516
+ ```
1517
+
1518
+ O para configurar sesiones con un hash de opciones:
1519
+
1520
+ ```ruby
1521
+ set :sessions, :expire_after => 2592000
1522
+ set :session_store, Rack::Session::Pool
1523
+ ```
1524
+
1525
+ Otra opción es **no** llamar a `enable :sessions`, sino
1526
+ su middleware de elección como lo haría con cualquier otro middleware.
1527
+
1528
+ Es importante tener en cuenta que al usar este método, la protección
1529
+ de sesiones **no estará habilitada por defecto**.
1530
+
1531
+ También será necesario agregar el middleware de Rack para hacer eso:
1532
+
1533
+ ```ruby
1534
+ use Rack::Session::Pool, :expire_after => 2592000
1535
+ use Rack::Protection::RemoteToken
1536
+ use Rack::Protection::SessionHijacking
1537
+ ```
1538
+
1539
+ Mira '[Configurando la protección contra ataques](#configurando-la-protección-contra-ataques)' para mas información.
1540
+
1188
1541
  ### Interrupción
1189
1542
 
1190
- Para detener inmediatamente una petición dentro de un filtro o una ruta usá:
1543
+ Para detener inmediatamente una petición dentro de un filtro o una ruta debes usar:
1191
1544
 
1192
1545
  ```ruby
1193
1546
  halt
1194
1547
  ```
1195
1548
 
1196
- También podés especificar el estado:
1549
+ También puedes especificar el estado:
1197
1550
 
1198
1551
  ```ruby
1199
1552
  halt 410
@@ -1242,10 +1595,10 @@ end
1242
1595
  Se sale inmediatamente del bloque de la ruta y se le pasa el control a la
1243
1596
  siguiente ruta que coincida. Si no coincide ninguna ruta, se devuelve 404.
1244
1597
 
1245
- ### Ejecutando Otra Ruta
1598
+ ### Desencadenando Otra Ruta
1246
1599
 
1247
- Cuando querés obtener el resultado de la llamada a una ruta, `pass` no te va a
1248
- servir. Para lograr esto, podés usar `call`:
1600
+ A veces, `pass` no es lo que quieres, sino obtener el
1601
+ resultado de la llamada a otra ruta. Simplemente use `call` para lograr esto:
1249
1602
 
1250
1603
  ```ruby
1251
1604
  get '/foo' do
@@ -1258,22 +1611,22 @@ get '/bar' do
1258
1611
  end
1259
1612
  ```
1260
1613
 
1261
- Notá que en el ejemplo anterior, es conveniente mover `"bar"` a un
1614
+ Nota que en el ejemplo anterior, es conveniente mover `"bar"` a un
1262
1615
  helper, y llamarlo desde `/foo` y `/bar`. Así, vas a simplificar
1263
1616
  las pruebas y a mejorar el rendimiento.
1264
1617
 
1265
- Si querés que la petición se envíe a la misma instancia de la aplicación en
1618
+ Si quieres que la petición se envíe a la misma instancia de la aplicación en
1266
1619
  lugar de otra, usá `call!` en lugar de `call`.
1267
1620
 
1268
- En la especificación de Rack podés encontrar más información sobre
1621
+ En la especificación de Rack puedes encontrar más información sobre
1269
1622
  `call`.
1270
1623
 
1271
- ### Asignando el Código de Estado, los Encabezados y el Cuerpo de una Respuesta
1624
+ ### Configurando el Cuerpo, Código de Estado y los Encabezados
1272
1625
 
1273
1626
  Es posible, y se recomienda, asignar el código de estado y el cuerpo de una
1274
- respuesta con el valor de retorno de una ruta. De cualquier manera, en varios
1275
- escenarios, puede que sea conveniente asignar el cuerpo en un punto arbitrario
1276
- del flujo de ejecución con el método `body`. A partir de ahí, podés usar ese
1627
+ respuesta con el valor de retorno de una ruta. Sin embargo, en algunos
1628
+ escenarios puede que sea conveniente asignar el cuerpo en un punto arbitrario
1629
+ del flujo de ejecución con el método helper `body`. A partir de ahí, puedes usar ese
1277
1630
  mismo método para acceder al cuerpo de la respuesta:
1278
1631
 
1279
1632
  ```ruby
@@ -1287,9 +1640,9 @@ end
1287
1640
  ```
1288
1641
 
1289
1642
  También es posible pasarle un bloque a `body`, que será ejecutado por el Rack
1290
- handler (podés usar esto para implementar streaming, mirá "Valores de retorno").
1643
+ handler (puedes usar esto para implementar streaming, mira ["Valores de Retorno"](#valores-de-retorno)).
1291
1644
 
1292
- De manera similar, también podés asignar el código de estado y encabezados:
1645
+ De manera similar, también puedes asignar el código de estado y encabezados:
1293
1646
 
1294
1647
  ```ruby
1295
1648
  get '/foo' do
@@ -1301,8 +1654,8 @@ get '/foo' do
1301
1654
  end
1302
1655
  ```
1303
1656
 
1304
- También, al igual que `body`, tanto `status` como `headers` pueden utilizarse
1305
- para obtener sus valores cuando no se les pasa argumentos.
1657
+ También, al igual que `body`, `status` y `headers` sin agregarles argumentos pueden usarse
1658
+ para acceder a sus valores actuales.
1306
1659
 
1307
1660
  ### Streaming De Respuestas
1308
1661
 
@@ -1323,8 +1676,8 @@ get '/' do
1323
1676
  end
1324
1677
  ```
1325
1678
 
1326
- Podés implementar APIs de streaming,
1327
- [Server-Sent Events](https://w3c.github.io/eventsource/) y puede ser usado
1679
+ Puedes implementar APIs de streaming,
1680
+ [Server-Sent Events](https://html.spec.whatwg.org/multipage/server-sent-events.html#server-sent-events) y puede ser usado
1328
1681
  como base para [WebSockets](https://es.wikipedia.org/wiki/WebSockets). También
1329
1682
  puede ser usado para incrementar el throughput si solo una parte del contenido
1330
1683
  depende de un recurso lento.
@@ -1337,28 +1690,64 @@ vez cuando el bloque pasado a `stream` finalice su ejecución. Si estás usando
1337
1690
  Shotgun, el streaming no va a funcionar.
1338
1691
 
1339
1692
  Cuando se pasa `keep_open` como parámetro, no se va a enviar el mensaje
1340
- `close` al objeto de stream. Queda en vos cerrarlo en el punto de ejecución
1693
+ `close` al objeto de stream. Permite que tu lo cierres en el punto de ejecución
1341
1694
  que quieras. Nuevamente, hay que tener en cuenta que este comportamiento es
1342
- posible solo en servidores que soporten eventos, como Thin o Rainbows. El
1695
+ posible sólo en servidores que soporten eventos, como Rainbows. El
1343
1696
  resto de los servidores van a cerrar el stream de todos modos:
1344
1697
 
1345
1698
  ```ruby
1346
- set :server, :thin
1347
- conexiones = []
1348
1699
 
1349
- get '/' do
1350
- # mantenemos abierto el stream
1351
- stream(:keep_open) { |salida| conexiones << salida }
1700
+ # config.ru
1701
+ require 'sinatra/base'
1702
+
1703
+ class App < Sinatra::Base
1704
+ connections = []
1705
+
1706
+ get '/subscribe' do
1707
+ # registrar a un cliente interesado en los eventos del servidor
1708
+ stream(:keep_open) do |out|
1709
+ connections << out
1710
+ # purgar conexiones muertas
1711
+ connections.reject!(&:closed?)
1712
+ end
1713
+ end
1714
+
1715
+ post '/:message' do
1716
+ connections.each do |out|
1717
+ # notificar al cliente que ha llegado un nuevo mensaje
1718
+ out << params['message'] << "\n"
1719
+
1720
+ # indicar al cliente para conectarse de nuevo
1721
+ out.close
1722
+ end
1723
+
1724
+ # reconocer
1725
+ "message received"
1726
+ end
1352
1727
  end
1353
1728
 
1354
- post '/' do
1355
- # escribimos a todos los streams abiertos
1356
- conexiones.each { |salida| salida << params['mensaje'] << "\n" }
1357
- "mensaje enviado"
1729
+ run App
1730
+ ```
1731
+
1732
+ ```ruby
1733
+ # rainbows.conf
1734
+
1735
+ Rainbows! do
1736
+ use :EventMachine
1358
1737
  end
1359
1738
  ```
1360
1739
 
1361
- ### Log (Registro)
1740
+ Ejecute:
1741
+
1742
+ ```shell
1743
+ rainbows -c rainbows.conf
1744
+ ```
1745
+
1746
+ También es posible que el cliente cierre la conexión cuando intenta
1747
+ escribir en el socket. Debido a esto, se recomienda verificar con
1748
+ `out.closed?` antes de intentar escribir.
1749
+
1750
+ ### Logging
1362
1751
 
1363
1752
  En el ámbito de la petición, el helper `logger` (registrador) expone
1364
1753
  una instancia de `Logger`:
@@ -1375,7 +1764,7 @@ handler. Si el logueo está desactivado, este método va a devolver un
1375
1764
  objeto que se comporta como un logger pero que en realidad no hace
1376
1765
  nada. Así, no vas a tener que preocuparte por esta situación.
1377
1766
 
1378
- Tené en cuenta que el logueo está habilitado por defecto únicamente
1767
+ Ten en cuenta que el logueo está habilitado por defecto únicamente
1379
1768
  para `Sinatra::Application`. Si heredaste de
1380
1769
  `Sinatra::Base`, probablemente quieras habilitarlo manualmente:
1381
1770
 
@@ -1388,8 +1777,8 @@ end
1388
1777
  ```
1389
1778
 
1390
1779
  Para evitar que se inicialice cualquier middleware de logging, configurá
1391
- `logging` a `nil`. Tené en cuenta que, cuando hagas esto, `logger` va a
1392
- devolver `nil`. Un caso común es cuando querés usar tu propio logger. Sinatra
1780
+ `logging` a `nil`. Ten en cuenta que, cuando hagas esto, `logger` va a
1781
+ devolver `nil`. Un caso común es cuando quieres usar tu propio logger. Sinatra
1393
1782
  va a usar lo que encuentre en `env['rack.logger']`.
1394
1783
 
1395
1784
  ### Tipos Mime
@@ -1404,7 +1793,7 @@ configure do
1404
1793
  end
1405
1794
  ```
1406
1795
 
1407
- También lo podés usar con el ayudante `content_type`:
1796
+ También lo puedes usar con el helper `content_type`:
1408
1797
 
1409
1798
  ```ruby
1410
1799
  get '/' do
@@ -1428,7 +1817,7 @@ a continuación).
1428
1817
 
1429
1818
  ### Redirección del Navegador
1430
1819
 
1431
- Podés redireccionar al navegador con el método `redirect`:
1820
+ Puedes redireccionar al navegador con el método `redirect`:
1432
1821
 
1433
1822
  ```ruby
1434
1823
  get '/foo' do
@@ -1444,7 +1833,7 @@ redirect to('/bar'), 303
1444
1833
  redirect 'http://www.google.com/', 'te confundiste de lugar, compañero'
1445
1834
  ```
1446
1835
 
1447
- También podés redireccionar fácilmente de vuelta hacia la página desde donde
1836
+ También puedes redireccionar fácilmente de vuelta hacia la página desde donde
1448
1837
  vino el usuario con `redirect back`:
1449
1838
 
1450
1839
  ```ruby
@@ -1458,7 +1847,7 @@ get '/bar' do
1458
1847
  end
1459
1848
  ```
1460
1849
 
1461
- Para pasar argumentos con una redirección, podés agregarlos a la cadena de
1850
+ Para pasar argumentos con una redirección, puedes agregarlos a la cadena de
1462
1851
  búsqueda:
1463
1852
 
1464
1853
  ```ruby
@@ -1480,12 +1869,12 @@ get '/bar' do
1480
1869
  end
1481
1870
  ```
1482
1871
 
1483
- ### Cache Control
1872
+ ### Control del Cache
1484
1873
 
1485
1874
  Asignar tus encabezados correctamente es el cimiento para realizar un cacheo
1486
1875
  HTTP correcto.
1487
1876
 
1488
- Podés asignar el encabezado Cache-Control fácilmente:
1877
+ Puedes asignar el encabezado Cache-Control fácilmente:
1489
1878
 
1490
1879
  ```ruby
1491
1880
  get '/' do
@@ -1558,7 +1947,7 @@ De acuerdo con la RFC 2616 tu aplicación debería comportarse diferente si a la
1558
1947
  cabeceras If-Match o If-None-Match se le asigna el valor `*` cuando el
1559
1948
  recurso solicitado ya existe. Sinatra asume para peticiones seguras (como get)
1560
1949
  y potentes (como put) que el recurso existe, mientras que para el resto
1561
- (como post) asume que no. Podés cambiar este comportamiento con la opción
1950
+ (como post) asume que no. Puedes cambiar este comportamiento con la opción
1562
1951
  `:new_resource`:
1563
1952
 
1564
1953
  ```ruby
@@ -1569,7 +1958,7 @@ get '/crear' do
1569
1958
  end
1570
1959
  ```
1571
1960
 
1572
- Si querés seguir usando una weak ETag, indicalo con la opción `:kind`:
1961
+ Si quieres seguir usando una weak ETag, indicalo con la opción `:kind`:
1573
1962
 
1574
1963
  ```ruby
1575
1964
  etag '', :new_resource => true, :kind => :weak
@@ -1577,7 +1966,7 @@ etag '', :new_resource => true, :kind => :weak
1577
1966
 
1578
1967
  ### Enviando Archivos
1579
1968
 
1580
- Para enviar archivos, podés usar el método `send_file`:
1969
+ Para enviar archivos, puedes usar el método `send_file`:
1581
1970
 
1582
1971
  ```ruby
1583
1972
  get '/' do
@@ -1593,33 +1982,33 @@ send_file 'foo.png', :type => :jpg
1593
1982
 
1594
1983
  Estas opciones son:
1595
1984
 
1596
- [filename]
1597
- nombre del archivo devuelto, por defecto es el nombre real del archivo.
1598
-
1599
- [last_modified]
1600
- valor para el encabezado Last-Modified, por defecto toma el mtime del archivo.
1601
-
1602
- [type]
1603
- el content type que se va a utilizar, si no está presente se intenta adivinar
1604
- a partir de la extensión del archivo.
1605
-
1606
- [disposition]
1607
- se utiliza para el encabezado Content-Disposition, y puede tomar alguno de los
1608
- siguientes valores: `nil` (por defecto), `:attachment` e
1609
- `:inline`
1610
-
1611
- [length]
1612
- encabezado Content-Length, por defecto toma el tamaño del archivo.
1613
-
1614
- [status]
1615
- código de estado devuelto. Resulta útil al enviar un archivo estático como una
1616
- página de error.
1617
-
1618
- Si el Rack handler lo soporta, se intentará no transmitir directamente desde el
1619
- proceso de Ruby. Si usás este método, Sinatra se va a encargar automáticamente de las
1620
- peticiones de rango.
1985
+ <dl>
1986
+ <dt>filename</dt>
1987
+ <dd>Nombre del archivo devuelto, por defecto es el nombre real del archivo.</dd>
1988
+
1989
+ <dt>last_modified</dt>
1990
+ <dd>Valor para el encabezado Last-Modified, por defecto toma el mtime del archivo.</dd>
1991
+
1992
+ <dt>type</dt>
1993
+ <dd>El Content-Type que se va a utilizar, si no está presente se intenta
1994
+ adivinar a partir de la extensión del archivo.</dd>
1995
+
1996
+ <dt>disposition</dt>
1997
+ <dd>
1998
+ Se utiliza para el encabezado Content-Disposition, y puede tomar alguno de los
1999
+ siguientes valores: <tt>nil</tt> (por defecto), <tt>:attachment</tt> y <tt>:inline</tt>
2000
+ </dd>
2001
+
2002
+ <dt>length</dt>
2003
+ <dd>Encabezado Content-Length, por defecto toma el tamaño del archivo</dd>
2004
+
2005
+ <dt>status</dt>
2006
+ <dd>
2007
+ Código de estado a enviar. Útil cuando se envía un archivo estático como un error página. Si es compatible con el controlador de Rack, otros medios que no sean la transmisión del proceso de Ruby será utilizado. Si usas este método de ayuda, Sinatra manejará automáticamente las solicitudes de rango.
2008
+ </dd>
2009
+ </dl>
1621
2010
 
1622
- ### Accediendo al objeto de la petición
2011
+ ### Accediendo al objeto Request
1623
2012
 
1624
2013
  El objeto de la petición entrante puede ser accedido desde el nivel de la
1625
2014
  petición (filtros, rutas y manejadores de errores) a través del método
@@ -1681,7 +2070,7 @@ end
1681
2070
 
1682
2071
  ### Archivos Adjuntos
1683
2072
 
1684
- Podés usar el helper `attachment` para indicarle al navegador que
2073
+ Puedes usar el helper `attachment` para indicarle al navegador que
1685
2074
  almacene la respuesta en el disco en lugar de mostrarla en pantalla:
1686
2075
 
1687
2076
  ```ruby
@@ -1691,7 +2080,7 @@ get '/' do
1691
2080
  end
1692
2081
  ```
1693
2082
 
1694
- También podés pasarle un nombre de archivo:
2083
+ También puedes pasarle un nombre de archivo:
1695
2084
 
1696
2085
  ```ruby
1697
2086
  get '/' do
@@ -1747,7 +2136,7 @@ find_template settings.views, 'foo', Tilt[:haml] do |archivo|
1747
2136
  end
1748
2137
  ```
1749
2138
 
1750
- Si bien esto no es muy útil, lo interesante es que podés sobreescribir este
2139
+ Si bien esto no es muy útil, lo interesante es que puedes sobreescribir este
1751
2140
  método, y así enganchar tu propio mecanismo de búsqueda. Por ejemplo, para
1752
2141
  poder utilizar más de un directorio de vistas:
1753
2142
 
@@ -1803,7 +2192,7 @@ configure do
1803
2192
  # atajo para `set :opcion, false`
1804
2193
  disable :opcion
1805
2194
 
1806
- # también podés tener configuraciones dinámicas usando bloques
2195
+ # también puedes tener configuraciones dinámicas usando bloques
1807
2196
  set(:css_dir) { File.join(views, 'css') }
1808
2197
  end
1809
2198
  ```
@@ -1825,7 +2214,7 @@ configure :production, :test do
1825
2214
  end
1826
2215
  ```
1827
2216
 
1828
- Podés acceder a estas opciones utilizando el método `settings`:
2217
+ Puedes acceder a estas opciones utilizando el método `settings`:
1829
2218
 
1830
2219
  ```ruby
1831
2220
  configure do
@@ -1839,11 +2228,11 @@ get '/' do
1839
2228
  end
1840
2229
  ```
1841
2230
 
1842
- ### Configurando la Protección de Ataques
2231
+ ### Configurando la Protección Contra Ataques
1843
2232
 
1844
- Sinatra usa [Rack::Protection](https://github.com/sinatra/rack-protection#readme)
2233
+ Sinatra usa [Rack::Protection](https://github.com/sinatra/sinatra/tree/master/rack-protection#readme)
1845
2234
  para defender a tu aplicación de los ataques más comunes. Si por algún motivo,
1846
- querés desactivar esta funcionalidad, podés hacerlo como se indica a
2235
+ quieres desactivar esta funcionalidad, puedes hacerlo como se indica a
1847
2236
  continuación (ten en cuenta que tu aplicación va a quedar expuesta a un
1848
2237
  montón de vulnerabilidades bien conocidas):
1849
2238
 
@@ -1872,22 +2261,22 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1872
2261
  redirecciones relativas, sin embargo, como consecuencia
1873
2262
  de esto, va a dejar de cumplir con el RFC 2616 (HTTP
1874
2263
  1.1), que solamente permite redirecciones absolutas.
1875
-
2264
+ </dd>
2265
+ <dd>
1876
2266
  Activalo si tu apliación está corriendo atrás de un proxy
1877
2267
  reverso que no se ha configurado adecuadamente. Notá que
1878
2268
  el helper <tt>url</tt> va a seguir produciendo URLs absolutas, a
1879
2269
  menos que le pasés <tt>false</tt> como segundo parámetro.
1880
-
1881
- Deshabilitada por defecto.
2270
+ </dd>
2271
+ <dd>Deshabilitada por defecto.</dd>
1882
2272
  </dd>
1883
2273
 
1884
2274
  <dt>add_charset</dt>
1885
2275
  <dd>
1886
2276
  Tipos mime a los que el helper <tt>content_type</tt> les
1887
- añade automáticamente el charset.
1888
-
1889
- En general, no deberías asignar directamente esta opción,
1890
- sino añadirle los charsets que quieras:
2277
+ añade automáticamente el charset. En general, no deberías
2278
+ asignar directamente esta opción, sino añadirle los charsets
2279
+ que quieras:
1891
2280
  <tt>settings.add_charset &lt;&lt; "application/foobar"</tt>
1892
2281
  </dd>
1893
2282
 
@@ -1901,7 +2290,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1901
2290
  <dt>bind</dt>
1902
2291
  <dd>
1903
2292
  Dirección IP que utilizará el servidor integrado (por
1904
- defecto: 0.0.0.0).
2293
+ defecto: <tt>0.0.0.0</tt> <em>o</em> <tt>localhost</tt>
2294
+ si su `environment` está configurado para desarrollo).
1905
2295
  </dd>
1906
2296
 
1907
2297
  <dt>default_encoding</dt>
@@ -1931,7 +2321,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1931
2321
  <dd>
1932
2322
  Coloca un lock alrededor de cada petición, procesando
1933
2323
  solamente una por proceso.
1934
-
2324
+ </dd>
2325
+ <dd>
1935
2326
  Habilitá esta opción si tu aplicación no es thread-safe.
1936
2327
  Se encuentra deshabilitada por defecto.
1937
2328
  </dd>
@@ -1942,7 +2333,13 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1942
2333
  formularios put/delete en navegadores que no los
1943
2334
  soportan.
1944
2335
  </dd>
1945
-
2336
+
2337
+ <dt>mustermann_opts</dt>
2338
+ <dd>
2339
+ Un hash predeterminado de opciones para pasar a Mustermann.new
2340
+ al compilar las rutas.
2341
+ </dd>
2342
+
1946
2343
  <dt>port</dt>
1947
2344
  <dd>
1948
2345
  Puerto en el que escuchará el servidor integrado.
@@ -1960,16 +2357,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1960
2357
 
1961
2358
  <dt>protection</dt>
1962
2359
  <dd>
1963
- Define si deben activarse las protecciones para los
1964
- ataques web más comunes. Para más detalles mirá la
1965
- sección sobre la configuración de protección de ataques
1966
- más arriba.
1967
- </dd>
1968
-
1969
- <dt>public_dir</dt>
1970
- <dd>
1971
- Alias para <tt>public_folder</tt>, que se encuentra a
1972
- continuación.
2360
+ Define si se habilitan o no las protecciones de ataques web.
2361
+ Ver la sección de protección encima.
1973
2362
  </dd>
1974
2363
 
1975
2364
  <dt>public_folder</dt>
@@ -1980,12 +2369,17 @@ set :protection, :except => [:path_traversal, :session_hijacking]
1980
2369
  está presente, se infiere del valor de la opción
1981
2370
  <tt>app_file</tt>.
1982
2371
  </dd>
2372
+
2373
+ <dt>quiet</dt>
2374
+ <dd>
2375
+ Inhabilita los logs generados por los comandos de inicio y detención de Sinatra.
2376
+ <tt> false </tt> por defecto.
2377
+ </dd>
1983
2378
 
1984
2379
  <dt>reload_templates</dt>
1985
2380
  <dd>
1986
- Define si se recargan las plantillas entre peticiones.
1987
-
1988
- Se encuentra activado en el entorno de desarrollo.
2381
+ Define Si se vuelven a cargar plantillas entre las solicitudes o no. Habilitado en
2382
+ modo de desarrollo.
1989
2383
  </dd>
1990
2384
 
1991
2385
  <dt>root</dt>
@@ -2019,8 +2413,13 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2019
2413
  <dt>server</dt>
2020
2414
  <dd>
2021
2415
  Servidor, o lista de servidores, para usar como servidor
2022
- integrado. Por defecto: <tt>['thin', 'mongrel', 'webrick']</tt>,
2023
- el orden establece la prioridad.
2416
+ integrado. El orden indica su prioridad, por defecto depende
2417
+ de la implementación de Ruby.
2418
+ </dd>
2419
+
2420
+ <dt>server_settings</dt>
2421
+ <dd>
2422
+ Si está utilizando un servidor web WEBrick, presumiblemente para su entorno de desarrollo, puede pasar un hash de opciones a <tt> server_settings </tt>, como <tt> SSLEnable </tt> o <tt> SSLVerifyClient </tt>. Sin embargo, los servidores web como Puma no son compatibles, por lo que puede establecer <tt> server_settings </tt> definiéndolo como un método cuando llame a <tt> configure </tt>.
2024
2423
  </dd>
2025
2424
 
2026
2425
  <dt>sessions</dt>
@@ -2029,6 +2428,13 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2029
2428
  través de <tt>Rack::Session::Cookie</tt>. Ver la
2030
2429
  sección 'Usando Sesiones' para más información.
2031
2430
  </dd>
2431
+
2432
+ <dt>session_store</dt>
2433
+ <dd>
2434
+ Define el middleware de sesión Rack utilizado. Predeterminado a
2435
+ <tt>Rack::Session::Cookie</tt>. Consulte la sección 'Uso de sesiones' para obtener más información.
2436
+ información.
2437
+ </dd>
2032
2438
 
2033
2439
  <dt>show_exceptions</dt>
2034
2440
  <dd>
@@ -2037,17 +2443,19 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2037
2443
  valor de <tt>environment</tt> es <tt>"development"</tt>.
2038
2444
  En caso contrario estará desactivada.
2039
2445
  </dd>
2446
+ <dd>
2447
+ También se puede establecer en <tt> :after_handler </tt> para activar la aplicación especificada
2448
+ que hara el manejo de errores antes de mostrar un stack trace en el navegador.
2449
+ </dd>
2040
2450
 
2041
2451
  <dt>static</dt>
2042
2452
  <dd>
2043
- Define si Sinatra debe encargarse de servir archivos
2044
- estáticos.
2045
-
2046
- Deshabilitala cuando uses un servidor capaz de
2047
- hacerlo por solo, porque mejorará el
2048
- rendimiento. Se encuentra habilitada por
2049
- defecto en el estilo clásico y desactivado en el
2050
- el modular.
2453
+ <dd> Define si Sinatra debe servir los archivos estáticos. </dd>
2454
+ <dd> Deshabilitar cuando se utiliza un servidor capaz de hacer esto por su cuenta. </dd>
2455
+ <dd> La desactivación aumentará el rendimiento. </dd>
2456
+ <dd>
2457
+ Habilitado por defecto en estilo clásico, deshabilitado para aplicaciones modulares.
2458
+ </dd>
2051
2459
  </dd>
2052
2460
 
2053
2461
  <dt>static_cache_control</dt>
@@ -2060,12 +2468,26 @@ set :protection, :except => [:path_traversal, :session_hijacking]
2060
2468
  utilizar un array cuando se asignan múltiples valores:
2061
2469
  <tt>set :static_cache_control, [:public, :max_age => 300]</tt>.
2062
2470
  </dd>
2471
+
2472
+ <dt>threaded</dt>
2473
+ <dd>
2474
+ Si se establece en <tt> true </tt>, le dirá al servidor que use
2475
+ <tt> EventMachine.defer </tt> para procesar la solicitud.
2476
+ </dd>
2477
+
2478
+ <dt> traps </dt>
2479
+ <dd> Define si Sinatra debería manejar las señales del sistema. </dd>
2063
2480
 
2064
2481
  <dt>views</dt>
2065
2482
  <dd>
2066
2483
  Path del directorio de las vistas. Si no está presente,
2067
2484
  se infiere del valor de la opción <tt>app_file</tt>.
2068
2485
  </dd>
2486
+ <dt>x_cascade</dt>
2487
+ <dd>
2488
+ Establece o no el encabezado de X-Cascade si no hay una coincidencia de ruta.
2489
+ <tt> verdadero </tt> por defecto.
2490
+ </dd>
2069
2491
  </dl>
2070
2492
 
2071
2493
  ## Entornos
@@ -2080,23 +2502,31 @@ de `production` y `test`, donde se cachean.
2080
2502
  especiales que muestran un stack trace en el navegador cuando son disparados.
2081
2503
 
2082
2504
  Para utilizar alguno de los otros entornos puede asignarse el valor
2083
- correspondiente a la variable de entorno `APP_ENV`, o bien utilizar la opción
2084
- `-e` al ejecutar la aplicación:
2085
-
2505
+ correspondiente a la variable de entorno `APP_ENV`:
2086
2506
  ```shell
2087
- ruby mi_app.rb -e <ENTORNO>
2507
+ APP_ENV=production ruby my_app.rb
2088
2508
  ```
2089
2509
 
2090
2510
  Los métodos `development?`, `test?` y `production?` te permiten conocer el
2091
2511
  entorno actual.
2092
2512
 
2513
+ ```ruby
2514
+ get '/' do
2515
+ if settings.development?
2516
+ "development!"
2517
+ else
2518
+ "not development!"
2519
+ end
2520
+ end
2521
+ ```
2522
+
2093
2523
  ## Manejo de Errores
2094
2524
 
2095
2525
  Los manejadores de errores se ejecutan dentro del mismo contexto que las rutas
2096
- y los filtros `before`, lo que significa que podés usar, por ejemplo,
2526
+ y los filtros `before`, lo que significa que puedes usar, por ejemplo,
2097
2527
  `haml`, `erb`, `halt`, etc.
2098
2528
 
2099
- ### No encontrado <em>(Not Found)</em>
2529
+ ### Not Found
2100
2530
 
2101
2531
  Cuando se eleva una excepción `Sinatra::NotFound`, o el código de
2102
2532
  estado de la respuesta es 404, el manejador `not_found` es invocado:
@@ -2135,11 +2565,13 @@ get '/' do
2135
2565
  end
2136
2566
  ```
2137
2567
 
2138
- Obtenés esto:
2568
+ Obtienes esto:
2139
2569
 
2570
+ ```
2140
2571
  Lo que pasó fue... algo malo
2572
+ ```
2141
2573
 
2142
- También, podés instalar un manejador de errores para un código de estado:
2574
+ También, puedes instalar un manejador de errores para un código de estado:
2143
2575
 
2144
2576
  ```ruby
2145
2577
  error 403 do
@@ -2160,7 +2592,8 @@ end
2160
2592
  ```
2161
2593
 
2162
2594
  Sinatra instala manejadores `not_found` y `error` especiales
2163
- cuando se ejecuta dentro del entorno de desarrollo "development".
2595
+ cuando se ejecuta dentro del entorno de desarrollo "development" y se muestran
2596
+ en tu navegador para que tengas información adicional sobre el error.
2164
2597
 
2165
2598
  ## Rack Middleware
2166
2599
 
@@ -2187,7 +2620,7 @@ end
2187
2620
  ```
2188
2621
 
2189
2622
  La semántica de `use` es idéntica a la definida para el DSL
2190
- Rack::Builder[http://www.rubydoc.info/github/rack/rack/master/Rack/Builder] (más
2623
+ [Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder) (más
2191
2624
  frecuentemente usado en archivos rackup). Por ejemplo, el método `use`
2192
2625
  acepta argumentos múltiples/variables así como bloques:
2193
2626
 
@@ -2202,7 +2635,7 @@ debugging, enrutamiento URL, autenticación y manejo de sesiones. Sinatra
2202
2635
  usa muchos de estos componentes automáticamente de acuerdo a su configuración
2203
2636
  para que usualmente no tengas que usarlas (con `use`) explícitamente.
2204
2637
 
2205
- Podés encontrar middleware útil en
2638
+ Puedes encontrar middleware útil en
2206
2639
  [rack](https://github.com/rack/rack/tree/master/lib/rack),
2207
2640
  [rack-contrib](https://github.com/rack/rack-contrib#readme),
2208
2641
  o en la [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
@@ -2242,6 +2675,9 @@ class MiAppTest < Minitest::Test
2242
2675
  end
2243
2676
  ```
2244
2677
 
2678
+ Nota: Si está utilizando Sinatra en el estilo modular, reemplace
2679
+ `Sinatra::Application` anterior con el nombre de clase de su aplicación.
2680
+
2245
2681
  ## Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares
2246
2682
 
2247
2683
  Definir tu aplicación en el nivel superior funciona bien para micro-aplicaciones
@@ -2281,6 +2717,19 @@ aplicaciones top-level se pueden convertir en componentes
2281
2717
  desactivadas por defecto, incluyendo el servidor incorporado. Mirá
2282
2718
  [Opciones y Configuraciones](http://www.sinatrarb.com/configuration.html)
2283
2719
  para detalles sobre las opciones disponibles y su comportamiento.
2720
+ Si quieres un comportamiento más similar
2721
+ a cuando defines tu aplicación en el nivel superior (también conocido como Clásico)
2722
+ estilo), puede subclase `Sinatra::Aplicación`
2723
+
2724
+ ```ruby
2725
+ require 'sinatra/base'
2726
+
2727
+ class MiAplicacion < Sinatra::Application
2728
+ get '/' do
2729
+ 'Hola Mundo!'
2730
+ end
2731
+ end
2732
+ ```
2284
2733
 
2285
2734
  ### Estilo Modular vs. Clásico
2286
2735
 
@@ -2288,7 +2737,7 @@ Contrariamente a la creencia popular, no hay nada de malo con el estilo clásico
2288
2737
  Si se ajusta a tu aplicación, no es necesario que la cambies a una modular.
2289
2738
 
2290
2739
  La desventaja de usar el estilo clásico en lugar del modular consiste en que
2291
- solamente podés tener una aplicación Sinatra por proceso Ruby. Si tenés
2740
+ solamente puedes tener una aplicación Sinatra por proceso Ruby. Si tienes
2292
2741
  planificado usar más, cambiá al estilo modular. Al mismo tiempo, ten en
2293
2742
  cuenta que no hay ninguna razón por la cuál no puedas mezclar los estilos
2294
2743
  clásico y modular.
@@ -2298,45 +2747,52 @@ de ambos estilos:
2298
2747
 
2299
2748
  <table>
2300
2749
  <tr>
2301
- <td>Configuración</td>
2302
- <td>Clásica</td>
2303
- <td>Modular</td>
2750
+ <th>Configuración</th>
2751
+ <th>Clásica</th>
2752
+ <th>Modular</th>
2753
+ <th>Modular</th>
2304
2754
  </tr>
2305
2755
 
2306
2756
  <tr>
2307
2757
  <td>app_file</td>
2308
2758
  <td>archivo que carga sinatra</td>
2309
2759
  <td>archivo con la subclase de Sinatra::Base</td>
2760
+ <td>archivo con la subclase Sinatra::Application</td>
2310
2761
  </tr>
2311
2762
 
2312
2763
  <tr>
2313
2764
  <td>run</td>
2314
2765
  <td>$0 == app_file</td>
2315
2766
  <td>false</td>
2767
+ <td>false</td>
2316
2768
  </tr>
2317
2769
 
2318
2770
  <tr>
2319
2771
  <td>logging</td>
2320
2772
  <td>true</td>
2321
2773
  <td>false</td>
2774
+ <td>true</td>
2322
2775
  </tr>
2323
2776
 
2324
2777
  <tr>
2325
2778
  <td>method_override</td>
2326
2779
  <td>true</td>
2327
2780
  <td>false</td>
2781
+ <td>true</td>
2328
2782
  </tr>
2329
2783
 
2330
2784
  <tr>
2331
2785
  <td>inline_templates</td>
2332
2786
  <td>true</td>
2333
2787
  <td>false</td>
2788
+ <td>true</td>
2334
2789
  </tr>
2335
2790
 
2336
2791
  <tr>
2337
2792
  <td>static</td>
2338
2793
  <td>true</td>
2339
2794
  <td>File.exist?(public_folder)</td>
2795
+ <td>true</td>
2340
2796
  </tr>
2341
2797
  </table>
2342
2798
 
@@ -2399,15 +2855,15 @@ run Sinatra::Application
2399
2855
 
2400
2856
  ### ¿Cuándo usar config.ru?
2401
2857
 
2402
- Indicadores de que probablemente querés usar `config.ru`:
2858
+ Indicadores de que probablemente quieres usar `config.ru`:
2403
2859
 
2404
- * Querés realizar el deploy con un handler Rack distinto (Passenger, Unicorn,
2860
+ * Quieres realizar el deploy con un handler Rack distinto (Passenger, Unicorn,
2405
2861
  Heroku, ...).
2406
- * Querés usar más de una subclase de `Sinatra::Base`.
2407
- * Querés usar Sinatra únicamente para middleware, pero no como un endpoint.
2862
+ * Quieres usar más de una subclase de `Sinatra::Base`.
2863
+ * Quieres usar Sinatra únicamente para middleware, pero no como un endpoint.
2408
2864
 
2409
2865
  <b>No hay necesidad de utilizar un archivo `config.ru` exclusivamente
2410
- porque tenés una aplicación modular, y no necesitás una aplicación modular para
2866
+ porque tienes una aplicación modular, y no necesitás una aplicación modular para
2411
2867
  iniciarla con `config.ru`.</b>
2412
2868
 
2413
2869
  ### Utilizando Sinatra como Middleware
@@ -2452,7 +2908,7 @@ end
2452
2908
 
2453
2909
  Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
2454
2910
  tiempo de ejecución sin tener que asignarlas a una constante. Para
2455
- esto tenés `Sinatra.new`:
2911
+ esto tienes `Sinatra.new`:
2456
2912
 
2457
2913
  ```ruby
2458
2914
  require 'sinatra/base'
@@ -2499,7 +2955,7 @@ run ProyectoRails::Application
2499
2955
 
2500
2956
  ## Ámbitos y Ligaduras
2501
2957
 
2502
- El ámbito en el que te encontrás determina que métodos y variables están
2958
+ El ámbito en el que te encuentras determina que métodos y variables están
2503
2959
  disponibles.
2504
2960
 
2505
2961
  ### Ámbito de Aplicación/Clase
@@ -2507,8 +2963,8 @@ disponibles.
2507
2963
  Cada aplicación Sinatra es una subclase de `Sinatra::Base`. Si estás
2508
2964
  usando el DSL de top-level (`require 'sinatra'`), entonces esta clase es
2509
2965
  `Sinatra::Application`, de otra manera es la subclase que creaste
2510
- explícitamente. Al nivel de la clase tenés métodos como `get` o `before`, pero
2511
- no podés acceder a los objetos `request` o `session`, ya que hay una única
2966
+ explícitamente. Al nivel de la clase tienes métodos como `get` o `before`, pero
2967
+ no puedes acceder a los objetos `request` o `session`, ya que hay una única
2512
2968
  clase de la aplicación para todas las peticiones.
2513
2969
 
2514
2970
  Las opciones creadas utilizando `set` son métodos al nivel de la clase:
@@ -2525,12 +2981,13 @@ class MiApp < Sinatra::Base
2525
2981
  end
2526
2982
  ```
2527
2983
 
2528
- Tenés la ligadura al ámbito de la aplicación dentro de:
2984
+ Tienes la ligadura al ámbito de la aplicación dentro de:
2529
2985
 
2530
2986
  * El cuerpo de la clase de tu aplicación
2531
2987
  * Métodos definidos por extensiones
2532
2988
  * El bloque pasado a `helpers`
2533
2989
  * Procs/bloques usados como el valor para `set`
2990
+ * El bloque pasado a `Sinatra.new`
2534
2991
 
2535
2992
  Este ámbito puede alcanzarse de las siguientes maneras:
2536
2993
 
@@ -2541,8 +2998,8 @@ Este ámbito puede alcanzarse de las siguientes maneras:
2541
2998
 
2542
2999
  Para cada petición entrante, una nueva instancia de la clase de tu aplicación
2543
3000
  es creada y todos los bloques de rutas son ejecutados en ese ámbito. Desde este
2544
- ámbito podés acceder a los objetos `request` y `session` o llamar a los métodos
2545
- de renderización como `erb` o `haml`. Podés acceder al ámbito de la aplicación
3001
+ ámbito puedes acceder a los objetos `request` y `session` o llamar a los métodos
3002
+ de renderización como `erb` o `haml`. Puedes acceder al ámbito de la aplicación
2546
3003
  desde el ámbito de la petición utilizando `settings`:
2547
3004
 
2548
3005
  ```ruby
@@ -2562,23 +3019,23 @@ class MiApp < Sinatra::Base
2562
3019
  end
2563
3020
  ```
2564
3021
 
2565
- Tenés la ligadura al ámbito de la petición dentro de:
3022
+ Tienes la ligadura al ámbito de la petición dentro de:
2566
3023
 
2567
- * bloques pasados a get/head/post/put/delete/options
3024
+ * bloques pasados a get, head, post, put, delete, options, patch, link y unlink
2568
3025
  * filtros before/after
2569
- * métodos ayudantes
3026
+ * métodos helpers
2570
3027
  * plantillas/vistas
2571
3028
 
2572
3029
  ### Ámbito de Delegación
2573
3030
 
2574
3031
  El ámbito de delegación solo reenvía métodos al ámbito de clase. De cualquier
2575
- manera, no se comporta 100% como el ámbito de clase porque no tenés la ligadura
3032
+ manera, no se comporta 100% como el ámbito de clase porque no tienes la ligadura
2576
3033
  de la clase: únicamente métodos marcados explícitamente para delegación están
2577
3034
  disponibles y no compartís variables/estado con el ámbito de clase (léase:
2578
- tenés un `self` diferente). Podés agregar delegaciones de método llamando a
3035
+ tienes un `self` diferente). Puedes agregar delegaciones de método llamando a
2579
3036
  `Sinatra::Delegator.delegate :nombre_del_metodo`.
2580
3037
 
2581
- Tenés la ligadura al ámbito de delegación dentro de:
3038
+ Tienes és la ligadura al ámbito de delegación dentro de:
2582
3039
 
2583
3040
  * La ligadura del top-level, si hiciste `require "sinatra"`
2584
3041
  * Un objeto extendido con el mixin `Sinatra::Delegator`
@@ -2592,7 +3049,7 @@ que [extiende el objeto main](https://github.com/sinatra/sinatra/blob/ca06364/li
2592
3049
  Las aplicaciones Sinatra pueden ser ejecutadas directamente:
2593
3050
 
2594
3051
  ```shell
2595
- ruby miapp.rb [-h] [-x] [-e ENTORNO] [-p PUERTO] [-o HOST] [-s MANEJADOR]
3052
+ ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
2596
3053
  ```
2597
3054
 
2598
3055
  Las opciones son:
@@ -2602,25 +3059,26 @@ Las opciones son:
2602
3059
  -p # asigna el puerto (4567 es usado por defecto)
2603
3060
  -o # asigna el host (0.0.0.0 es usado por defecto)
2604
3061
  -e # asigna el entorno (development es usado por defecto)
2605
- -s # especifica el servidor/manejador rack (thin es usado por defecto)
3062
+ -s # especifica el servidor/manejador rack (puma es usado por defecto)
3063
+ -q # activar el modo silecioso para el servidor (está desactivado por defecto)
2606
3064
  -x # activa el mutex lock (está desactivado por defecto)
2607
3065
  ```
2608
3066
 
2609
3067
  ### Multi-threading
2610
3068
 
2611
- _Basado en [esta respuesta en StackOverflow][so-answer] escrita por Konstantin_
3069
+ _Basado en [esta respuesta en StackOverflow](http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999) escrita por Konstantin_
2612
3070
 
2613
3071
  Sinatra no impone ningún modelo de concurrencia, sino que lo deja en manos del
2614
- handler Rack que se esté usando (Thin, Puma, WEBrick). Sinatra en sí mismo es
3072
+ handler Rack que se esté usando (Puma o WEBrick). Sinatra en sí mismo es
2615
3073
  thread-safe, así que no hay problema en que el Rack handler use un modelo de
2616
3074
  concurrencia basado en hilos.
2617
3075
 
2618
3076
  Esto significa que, cuando estemos arrancando el servidor, tendríamos que
2619
3077
  especificar la opción adecuada para el handler Rack específico. En este ejemplo
2620
- vemos cómo arrancar un servidor Thin multihilo:
3078
+ vemos cómo arrancar un servidor Rainbows multihilo:
2621
3079
 
2622
3080
  ```ruby
2623
- # app.rb
3081
+ # config.ru
2624
3082
 
2625
3083
  require 'sinatra/base'
2626
3084
 
@@ -2630,67 +3088,52 @@ class App < Sinatra::Base
2630
3088
  end
2631
3089
  end
2632
3090
 
2633
- App.run!
3091
+ run App
3092
+ ```
3093
+
3094
+ ```ruby
3095
+ # rainbows.conf
3096
+
3097
+ # El configurador de Rainbows está basado en Unicorn.
3098
+
3099
+ Rainbows! do
3100
+ use :ThreadSpawn
3101
+ end
2634
3102
  ```
2635
3103
 
2636
3104
  Para arrancar el servidor, el comando sería:
2637
3105
 
2638
3106
  ```shell
2639
- thin --threaded start
3107
+ rainbows -c rainbows.conf
2640
3108
  ```
2641
3109
 
2642
- [so-answer]: http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999)
2643
-
2644
- ## Versiones de Ruby Soportadas
3110
+ ## Requerimientos
2645
3111
 
2646
3112
  Las siguientes versiones de Ruby son soportadas oficialmente:
2647
3113
 
2648
3114
  <dl>
2649
- <dt>Ruby 1.8.7</dt>
2650
- <dd>
2651
- 1.8.7 es soportado completamente. Sin embargo, si no hay nada que te lo
2652
- prohiba, te recomendamos que uses 1.9.2 o cambies a JRuby o Rubinius. No se
2653
- dejará de dar soporte a 1.8.7 hasta Sinatra 2.0 y Ruby 2.0, aunque si se
2654
- libera la versión 1.8.8 de Ruby las cosas podrían llegar a cambiar. Sin
2655
- embargo, que eso ocurra es muy poco probable, e incluso el caso de que lo
2656
- haga, puede que se siga dando soporte a 1.8.7. <b>Hemos dejado de soportar
2657
- Ruby 1.8.6.</b> Si querés ejecutar Sinatra sobre 1.8.6, podés utilizar la
2658
- versión 1.2, pero ten en cuenta que una vez que Sinatra 1.4.0 sea liberado,
2659
- ya no se corregirán errores por más que se reciban reportes de los mismos.
2660
- </dd>
2661
-
2662
- <dt>Ruby 1.9.2</dt>
2663
- <dd>
2664
- 1.9.2 es soportado y recomendado. No uses 1.9.2p0, porque se producen fallos
2665
- de segmentación cuando se ejecuta Sinatra. El soporte se mantendrá al menos
2666
- hasta que se libere la versión 1.9.4/2.0 de Ruby. El soporte para la última
2667
- versión de la serie 1.9 se mantendrá mientras lo haga el equipo principal de Ruby.
2668
- </dd>
2669
-
2670
- <dt>Ruby 1.9.3</dt>
2671
- <dd>
2672
- 1.9.3 es soportado y recomendado. Ten en cuenta que el cambio a 1.9.3 desde
2673
- una versión anterior va a invalidar todas las sesiones.
2674
- </dd>
3115
+ <dt>Ruby 2.3</dt>
3116
+ <dd>
3117
+ 2.3 Es totalmente compatible y recomendado. Actualmente no hay planes
3118
+ soltar el apoyo oficial para ello.
3119
+ </dd>
2675
3120
 
2676
3121
  <dt>Rubinius</dt>
2677
3122
  <dd>
2678
- Rubinius es soportado oficialmente (Rubinius >= 1.2.4). Todo funciona
2679
- correctamente, incluyendo los lenguajes de plantillas. La próxima versión,
2680
- 2.0, también es soportada, incluyendo el modo 1.9.
3123
+ Rubinius es oficialmente compatible (Rubinius> = 2.x). Se recomienda instalar la gema puma
3124
+ <tt>gem install puma</tt>.
2681
3125
  </dd>
2682
3126
 
2683
3127
  <dt>JRuby</dt>
2684
3128
  <dd>
2685
- JRuby es soportado oficialmente (JRuby >= 1.6.7). No se conocen problemas
2686
- con librerías de plantillas de terceras partes. Sin embargo, si elegís usar
2687
- JRuby, deberías examinar sus Rack handlers porque el servidor web Thin no es
2688
- soportado completamente. El soporte de JRuby para extensiones C se encuentra
2689
- en una etapa experimental, sin embargo, de momento, solamente RDiscount,
2690
- Redcarpet, RedCloth y Yajl, así como Thin y Mongrel se ven afectadas.
3129
+ La última versión estable de JRuby es oficialmente compatible. No lo es
3130
+ recomienda usar extensiones C con JRuby. Se recomienda instalar la gema trinidad
3131
+ <tt> gem install trinidad </tt>.
2691
3132
  </dd>
2692
3133
  </dl>
2693
3134
 
3135
+ Las versiones de Ruby anteriores a 2.2.2 ya no son compatibles con Sinatra 2.0 .
3136
+
2694
3137
  Siempre le prestamos atención a las nuevas versiones de Ruby.
2695
3138
 
2696
3139
  Las siguientes implementaciones de Ruby no se encuentran soportadas
@@ -2705,23 +3148,24 @@ No ser soportada oficialmente, significa que si las cosas se rompen
2705
3148
  ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
2706
3149
  el suyo.
2707
3150
 
2708
- Nuestro servidor CI también se ejecuta sobre ruby-head (que será la próxima
2709
- versión 2.1.0) y la rama 1.9.4. Como están en movimiento constante, no podemos
2710
- garantizar nada. De todas formas, podés contar con que tanto 1.9.4-p0 como
2711
- 2.1.0-p0 sea soportadas.
3151
+ También ejecutamos nuestro CI contra ruby-head (futuras versiones de MRI), pero
3152
+ no puede garantizar nada, ya que se mueve constantemente. Esperar próxima
3153
+ 2.x versiones para ser totalmente compatibles.
2712
3154
 
2713
- Sinatra debería funcionar en cualquier sistema operativo soportado por la
2714
- implementación de Ruby elegida.
3155
+ Sinatra debería trabajar en cualquier sistema operativo compatible la implementación de Ruby
3156
+ elegida
2715
3157
 
2716
- En este momento, no vas a poder ejecutar Sinatra en Cardinal, SmallRuby,
2717
- BlueRuby o cualquier versión de Ruby anterior a 1.8.7.
3158
+ Si ejecuta MacRuby, debe `gem install control_tower`.
3159
+
3160
+ Sinatra actualmente no funciona con Cardinal, SmallRuby, BlueRuby o cualquier
3161
+ versión de Ruby anterior a 2.2.
2718
3162
 
2719
3163
  ## A la Vanguardia
2720
3164
 
2721
- Si querés usar el código de Sinatra más reciente, sentite libre de ejecutar
3165
+ Si quieres usar el código de Sinatra más reciente, sientete libre de ejecutar
2722
3166
  tu aplicación sobre la rama master, en general es bastante estable.
2723
3167
 
2724
- También liberamos prereleases de vez en cuando, así, podés hacer:
3168
+ También liberamos prereleases de vez en cuando, así, puedes hacer:
2725
3169
 
2726
3170
  ```shell
2727
3171
  gem install sinatra --pre
@@ -2729,12 +3173,12 @@ gem install sinatra --pre
2729
3173
 
2730
3174
  Para obtener algunas de las últimas características.
2731
3175
 
2732
- ### Con Bundler
3176
+ ### Usando Bundler
2733
3177
 
2734
3178
  Esta es la manera recomendada para ejecutar tu aplicación sobre la última
2735
3179
  versión de Sinatra usando [Bundler](http://bundler.io).
2736
3180
 
2737
- Primero, instalá Bundler si no lo hiciste todavía:
3181
+ Primero, instala Bundler si no lo hiciste todavía:
2738
3182
 
2739
3183
  ```shell
2740
3184
  gem install bundler
@@ -2748,54 +3192,18 @@ gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
2748
3192
 
2749
3193
  # otras dependencias
2750
3194
  gem 'haml' # por ejemplo, si usás haml
2751
- gem 'activerecord', '~> 3.0' # quizás también necesités ActiveRecord 3.x
2752
3195
  ```
2753
3196
 
2754
- Tené en cuenta que tenés que listar todas las dependencias directas de tu
3197
+ Ten en cuenta que tienes que listar todas las dependencias directas de tu
2755
3198
  aplicación. No es necesario listar las dependencias de Sinatra (Rack y Tilt)
2756
3199
  porque Bundler las agrega directamente.
2757
3200
 
2758
- Ahora podés arrancar tu aplicación así:
3201
+ Ahora puedes arrancar tu aplicación así:
2759
3202
 
2760
3203
  ```shell
2761
3204
  bundle exec ruby miapp.rb
2762
3205
  ```
2763
3206
 
2764
- ### Con Git
2765
-
2766
- Cloná el repositorio localmente y ejecutá tu aplicación, asegurándote que el
2767
- directorio `sinatra/lib` esté en el `$LOAD_PATH`:
2768
-
2769
- ```shell
2770
- cd miapp
2771
- git clone git://github.com/sinatra/sinatra.git
2772
- ruby -Isinatra/lib miapp.rb
2773
- ```
2774
-
2775
- Para actualizar el código fuente de Sinatra en el futuro:
2776
-
2777
- ```shell
2778
- cd miapp/sinatra
2779
- git pull
2780
- ```
2781
-
2782
- ### Instalación Global
2783
-
2784
- Podés construir la gem vos mismo:
2785
-
2786
- ```shell
2787
- git clone git://github.com/sinatra/sinatra.git
2788
- cd sinatra
2789
- rake sinatra.gemspec
2790
- rake install
2791
- ```
2792
-
2793
- Si instalás tus gems como root, el último paso debería ser
2794
-
2795
- ```shell
2796
- sudo rake install
2797
- ```
2798
-
2799
3207
  ## Versionado
2800
3208
 
2801
3209
  Sinatra utiliza el [Versionado Semántico](http://semver.org/),
@@ -2806,11 +3214,13 @@ siguiendo las especificaciones SemVer y SemVerTag.
2806
3214
  * [Sito web del proyecto](http://www.sinatrarb.com/) - Documentación
2807
3215
  adicional, noticias, y enlaces a otros recursos.
2808
3216
  * [Contribuyendo](http://www.sinatrarb.com/contributing) - ¿Encontraste un
2809
- error?. ¿Necesitás ayuda?. ¿Tenés un parche?.
3217
+ error?. ¿Necesitas ayuda?. ¿Tienes un parche?.
2810
3218
  * [Seguimiento de problemas](https://github.com/sinatra/sinatra/issues)
2811
3219
  * [Twitter](https://twitter.com/sinatra)
2812
3220
  * [Lista de Correo](http://groups.google.com/group/sinatrarb/topics)
2813
3221
  * [IRC: #sinatra](irc://chat.freenode.net/#sinatra) en http://freenode.net
3222
+ * [Sinatra & Friends](https://sinatrarb.slack.com) en Slack y revisa
3223
+ [acá](https://sinatra-slack.herokuapp.com/) Para una invitación.
2814
3224
  * [Sinatra Book](https://github.com/sinatra/sinatra-book/) Tutorial (en inglés).
2815
3225
  * [Sinatra Recipes](http://recipes.sinatrarb.com/) Recetas contribuidas
2816
3226
  por la comunidad (en inglés).