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.
- checksums.yaml +5 -5
- data/AUTHORS.md +1 -0
- data/CHANGELOG.md +258 -37
- data/CONTRIBUTING.md +7 -7
- data/Gemfile +15 -6
- data/MAINTENANCE.md +2 -15
- data/README.de.md +22 -22
- data/README.es.md +772 -362
- data/README.fr.md +188 -91
- data/README.hu.md +3 -3
- data/README.ja.md +84 -54
- data/README.ko.md +7 -7
- data/README.malayalam.md +3141 -0
- data/README.md +165 -113
- data/README.pt-br.md +2366 -339
- data/README.pt-pt.md +3 -3
- data/README.ru.md +835 -564
- data/README.zh.md +83 -21
- data/Rakefile +10 -7
- data/VERSION +1 -0
- data/examples/chat.rb +2 -1
- data/examples/rainbows.conf +3 -0
- data/examples/rainbows.rb +20 -0
- data/examples/stream.ru +4 -4
- data/lib/sinatra/base.rb +160 -123
- data/lib/sinatra/indifferent_hash.rb +79 -15
- data/lib/sinatra/main.rb +30 -11
- data/lib/sinatra/show_exceptions.rb +8 -11
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +25 -7
- metadata +20 -22
data/README.es.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Sinatra
|
2
2
|
|
3
|
-
|
3
|
+
[](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
|
-
|
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
|
-
|
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
|
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/
|
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
|
-
|
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| # <-
|
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
|
-
|
345
|
+
## Valores de Retorno
|
214
346
|
|
215
|
-
El valor de retorno de un bloque de ruta
|
216
|
-
|
217
|
-
|
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
|
-
|
221
|
-
que represente el cuerpo de una respuesta Rack o un código
|
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 (
|
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 (
|
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
|
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
|
-
|
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,
|
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
|
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
|
-
|
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
|
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
|
-
|
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,
|
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` (
|
441
|
+
`Cache-Control` (Ver mas [abajo](#control-del-cache)).
|
306
442
|
|
307
|
-
|
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
|
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
|
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.
|
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
|
-
<
|
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
|
-
|
425
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
658
|
+
También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
|
500
659
|
|
501
|
-
|
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
|
-
|
677
|
+
También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
|
519
678
|
|
520
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
730
|
+
#### Plantillas Liquid
|
572
731
|
|
573
732
|
<table>
|
574
733
|
<tr>
|
575
734
|
<td>Dependencias</td>
|
576
|
-
<td><a href="
|
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
|
-
|
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="
|
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
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
921
|
+
También toma un bloque para plantillas inline (ver [ejemplo](#plantillas-inline)).
|
743
922
|
|
744
|
-
|
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
|
-
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
1121
|
+
var contenido = {"foo":"bar","baz":"qux"};
|
1122
|
+
present(contenido);
|
897
1123
|
```
|
898
1124
|
|
899
|
-
|
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
|
1223
|
+
%div.titulo Hola Mundo
|
974
1224
|
```
|
975
1225
|
|
976
|
-
NOTA:
|
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
|
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.
|
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,
|
1014
|
-
`Tilt.register`. Por ejemplo, si
|
1015
|
-
las plantillas Textile,
|
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
|
-
###
|
1271
|
+
### Añadiendo Tu Propio Motor de Plantillas
|
1022
1272
|
|
1023
|
-
Primero,
|
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,
|
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
|
-
##
|
1367
|
+
## Helpers
|
1101
1368
|
|
1102
|
-
Usá el método top-level
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
1159
|
-
|
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
|
-
|
1162
|
-
|
1163
|
-
|
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
|
-
|
1166
|
-
|
1167
|
-
|
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
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
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
|
-
|
1485
|
+
require 'securerandom'
|
1486
|
+
# -or- require 'sysrandom/securerandom'
|
1487
|
+
set :session_secret, ENV.fetch('SESSION_SECRET') { SecureRandom.hex(64) }
|
1179
1488
|
```
|
1180
1489
|
|
1181
|
-
|
1182
|
-
|
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
|
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
|
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
|
-
###
|
1598
|
+
### Desencadenando Otra Ruta
|
1246
1599
|
|
1247
|
-
|
1248
|
-
|
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
|
-
|
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
|
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
|
1621
|
+
En la especificación de Rack puedes encontrar más información sobre
|
1269
1622
|
`call`.
|
1270
1623
|
|
1271
|
-
###
|
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.
|
1275
|
-
escenarios
|
1276
|
-
del flujo de ejecución con el método `body`. A partir de ahí,
|
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 (
|
1643
|
+
handler (puedes usar esto para implementar streaming, mira ["Valores de Retorno"](#valores-de-retorno)).
|
1291
1644
|
|
1292
|
-
De manera similar, también
|
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`,
|
1305
|
-
para
|
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
|
-
|
1327
|
-
[Server-Sent Events](https://
|
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.
|
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
|
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
|
-
|
1350
|
-
|
1351
|
-
|
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
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
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
|
-
|
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
|
-
|
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`.
|
1392
|
-
devolver `nil`. Un caso común es cuando
|
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
|
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
|
-
|
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
|
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,
|
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
|
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
|
-
|
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.
|
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
|
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,
|
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
|
-
|
1597
|
-
|
1598
|
-
|
1599
|
-
|
1600
|
-
|
1601
|
-
|
1602
|
-
|
1603
|
-
|
1604
|
-
|
1605
|
-
|
1606
|
-
|
1607
|
-
|
1608
|
-
|
1609
|
-
|
1610
|
-
|
1611
|
-
|
1612
|
-
|
1613
|
-
|
1614
|
-
|
1615
|
-
|
1616
|
-
|
1617
|
-
|
1618
|
-
Si el Rack
|
1619
|
-
|
1620
|
-
|
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
|
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
|
-
|
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
|
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
|
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
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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 << "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
|
1964
|
-
|
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
|
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.
|
2023
|
-
|
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
|
-
|
2044
|
-
|
2045
|
-
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
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
|
2084
|
-
`-e` al ejecutar la aplicación:
|
2085
|
-
|
2505
|
+
correspondiente a la variable de entorno `APP_ENV`:
|
2086
2506
|
```shell
|
2087
|
-
ruby
|
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
|
2526
|
+
y los filtros `before`, lo que significa que puedes usar, por ejemplo,
|
2097
2527
|
`haml`, `erb`, `halt`, etc.
|
2098
2528
|
|
2099
|
-
###
|
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
|
-
|
2568
|
+
Obtienes esto:
|
2139
2569
|
|
2570
|
+
```
|
2140
2571
|
Lo que pasó fue... algo malo
|
2572
|
+
```
|
2141
2573
|
|
2142
|
-
También,
|
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
|
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
|
-
|
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
|
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
|
-
<
|
2302
|
-
<
|
2303
|
-
<
|
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
|
2858
|
+
Indicadores de que probablemente quieres usar `config.ru`:
|
2403
2859
|
|
2404
|
-
*
|
2860
|
+
* Quieres realizar el deploy con un handler Rack distinto (Passenger, Unicorn,
|
2405
2861
|
Heroku, ...).
|
2406
|
-
*
|
2407
|
-
*
|
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
|
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
|
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
|
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
|
2511
|
-
no
|
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
|
-
|
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
|
2545
|
-
de renderización como `erb` o `haml`.
|
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
|
-
|
3022
|
+
Tienes la ligadura al ámbito de la petición dentro de:
|
2566
3023
|
|
2567
|
-
* bloques pasados a get
|
3024
|
+
* bloques pasados a get, head, post, put, delete, options, patch, link y unlink
|
2568
3025
|
* filtros before/after
|
2569
|
-
* métodos
|
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
|
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
|
-
|
3035
|
+
tienes un `self` diferente). Puedes agregar delegaciones de método llamando a
|
2579
3036
|
`Sinatra::Delegator.delegate :nombre_del_metodo`.
|
2580
3037
|
|
2581
|
-
|
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
|
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 (
|
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]
|
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 (
|
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
|
3078
|
+
vemos cómo arrancar un servidor Rainbows multihilo:
|
2621
3079
|
|
2622
3080
|
```ruby
|
2623
|
-
#
|
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
|
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
|
-
|
3107
|
+
rainbows -c rainbows.conf
|
2640
3108
|
```
|
2641
3109
|
|
2642
|
-
|
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
|
2650
|
-
|
2651
|
-
|
2652
|
-
|
2653
|
-
|
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
|
2679
|
-
|
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
|
-
|
2686
|
-
|
2687
|
-
|
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
|
-
|
2709
|
-
|
2710
|
-
|
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
|
2714
|
-
|
3155
|
+
Sinatra debería trabajar en cualquier sistema operativo compatible la implementación de Ruby
|
3156
|
+
elegida
|
2715
3157
|
|
2716
|
-
|
2717
|
-
|
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
|
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í,
|
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
|
-
###
|
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,
|
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
|
-
|
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
|
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?. ¿
|
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).
|