sinatra 2.0.0 → 2.0.8.1
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 +157 -37
- data/CONTRIBUTING.md +7 -7
- data/Gemfile +10 -2
- data/README.de.md +6 -6
- data/README.es.md +733 -352
- data/README.fr.md +6 -6
- data/README.ja.md +22 -22
- data/README.ko.md +6 -6
- data/README.malayalam.md +3141 -0
- data/README.md +75 -56
- data/README.pt-br.md +2359 -332
- data/README.ru.md +834 -563
- data/README.zh.md +82 -20
- data/Rakefile +10 -7
- data/VERSION +1 -0
- data/lib/sinatra/base.rb +51 -55
- data/lib/sinatra/indifferent_hash.rb +65 -15
- data/lib/sinatra/main.rb +30 -11
- data/lib/sinatra/show_exceptions.rb +43 -11
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +26 -2
- metadata +16 -7
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,17 +15,117 @@ 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
|
|
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
|
+
|
27
36
|
Se recomienda ejecutar `gem install thin`, porque Sinatra lo utilizará si está disponible.
|
28
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)
|
128
|
+
|
29
129
|
## Rutas
|
30
130
|
|
31
131
|
En Sinatra, una ruta es un método HTTP junto a un patrón de un URL.
|
@@ -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, File.dirname(__FILE__) + '/
|
433
|
+
set :public_folder, File.dirname(__FILE__) + '/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
|
1447
|
+
```
|
1448
|
+
|
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
|
1168
1463
|
```
|
1169
1464
|
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
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,45 @@ 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
1695
|
posible solo en servidores que soporten eventos, como Thin o Rainbows. El
|
1343
1696
|
resto de los servidores van a cerrar el stream de todos modos:
|
1344
1697
|
|
1345
1698
|
```ruby
|
1346
|
-
|
1347
|
-
conexiones = []
|
1699
|
+
# long polling
|
1348
1700
|
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1701
|
+
set :server, :thin
|
1702
|
+
connections = []
|
1703
|
+
|
1704
|
+
get '/subscribe' do
|
1705
|
+
# registrar a un cliente interesado en los eventos del servidor
|
1706
|
+
stream(:keep_open) do |out|
|
1707
|
+
connections << out
|
1708
|
+
# purgar conexiones muertas
|
1709
|
+
connections.reject!(&:closed?)
|
1710
|
+
end
|
1352
1711
|
end
|
1353
1712
|
|
1354
|
-
post '
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1713
|
+
post '/:message' do
|
1714
|
+
connections.each do |out|
|
1715
|
+
# notificar al cliente que ha llegado un nuevo mensaje
|
1716
|
+
out << params['message'] << "\n"
|
1717
|
+
|
1718
|
+
# indicar al cliente para conectarse de nuevo
|
1719
|
+
out.close
|
1720
|
+
end
|
1721
|
+
|
1722
|
+
# reconocer
|
1723
|
+
"message received"
|
1358
1724
|
end
|
1359
1725
|
```
|
1360
1726
|
|
1361
|
-
|
1727
|
+
También es posible que el cliente cierre la conexión cuando intenta
|
1728
|
+
escribir en el socket. Debido a esto, se recomienda verificar con
|
1729
|
+
`out.closed?` antes de intentar escribir.
|
1730
|
+
|
1731
|
+
### Logging
|
1362
1732
|
|
1363
1733
|
En el ámbito de la petición, el helper `logger` (registrador) expone
|
1364
1734
|
una instancia de `Logger`:
|
@@ -1375,7 +1745,7 @@ handler. Si el logueo está desactivado, este método va a devolver un
|
|
1375
1745
|
objeto que se comporta como un logger pero que en realidad no hace
|
1376
1746
|
nada. Así, no vas a tener que preocuparte por esta situación.
|
1377
1747
|
|
1378
|
-
|
1748
|
+
Ten en cuenta que el logueo está habilitado por defecto únicamente
|
1379
1749
|
para `Sinatra::Application`. Si heredaste de
|
1380
1750
|
`Sinatra::Base`, probablemente quieras habilitarlo manualmente:
|
1381
1751
|
|
@@ -1388,8 +1758,8 @@ end
|
|
1388
1758
|
```
|
1389
1759
|
|
1390
1760
|
Para evitar que se inicialice cualquier middleware de logging, configurá
|
1391
|
-
`logging` a `nil`.
|
1392
|
-
devolver `nil`. Un caso común es cuando
|
1761
|
+
`logging` a `nil`. Ten en cuenta que, cuando hagas esto, `logger` va a
|
1762
|
+
devolver `nil`. Un caso común es cuando quieres usar tu propio logger. Sinatra
|
1393
1763
|
va a usar lo que encuentre en `env['rack.logger']`.
|
1394
1764
|
|
1395
1765
|
### Tipos Mime
|
@@ -1404,7 +1774,7 @@ configure do
|
|
1404
1774
|
end
|
1405
1775
|
```
|
1406
1776
|
|
1407
|
-
También lo
|
1777
|
+
También lo puedes usar con el helper `content_type`:
|
1408
1778
|
|
1409
1779
|
```ruby
|
1410
1780
|
get '/' do
|
@@ -1428,7 +1798,7 @@ a continuación).
|
|
1428
1798
|
|
1429
1799
|
### Redirección del Navegador
|
1430
1800
|
|
1431
|
-
|
1801
|
+
Puedes redireccionar al navegador con el método `redirect`:
|
1432
1802
|
|
1433
1803
|
```ruby
|
1434
1804
|
get '/foo' do
|
@@ -1444,7 +1814,7 @@ redirect to('/bar'), 303
|
|
1444
1814
|
redirect 'http://www.google.com/', 'te confundiste de lugar, compañero'
|
1445
1815
|
```
|
1446
1816
|
|
1447
|
-
También
|
1817
|
+
También puedes redireccionar fácilmente de vuelta hacia la página desde donde
|
1448
1818
|
vino el usuario con `redirect back`:
|
1449
1819
|
|
1450
1820
|
```ruby
|
@@ -1458,7 +1828,7 @@ get '/bar' do
|
|
1458
1828
|
end
|
1459
1829
|
```
|
1460
1830
|
|
1461
|
-
Para pasar argumentos con una redirección,
|
1831
|
+
Para pasar argumentos con una redirección, puedes agregarlos a la cadena de
|
1462
1832
|
búsqueda:
|
1463
1833
|
|
1464
1834
|
```ruby
|
@@ -1480,12 +1850,12 @@ get '/bar' do
|
|
1480
1850
|
end
|
1481
1851
|
```
|
1482
1852
|
|
1483
|
-
### Cache
|
1853
|
+
### Control del Cache
|
1484
1854
|
|
1485
1855
|
Asignar tus encabezados correctamente es el cimiento para realizar un cacheo
|
1486
1856
|
HTTP correcto.
|
1487
1857
|
|
1488
|
-
|
1858
|
+
Puedes asignar el encabezado Cache-Control fácilmente:
|
1489
1859
|
|
1490
1860
|
```ruby
|
1491
1861
|
get '/' do
|
@@ -1558,7 +1928,7 @@ De acuerdo con la RFC 2616 tu aplicación debería comportarse diferente si a la
|
|
1558
1928
|
cabeceras If-Match o If-None-Match se le asigna el valor `*` cuando el
|
1559
1929
|
recurso solicitado ya existe. Sinatra asume para peticiones seguras (como get)
|
1560
1930
|
y potentes (como put) que el recurso existe, mientras que para el resto
|
1561
|
-
(como post) asume que no.
|
1931
|
+
(como post) asume que no. Puedes cambiar este comportamiento con la opción
|
1562
1932
|
`:new_resource`:
|
1563
1933
|
|
1564
1934
|
```ruby
|
@@ -1569,7 +1939,7 @@ get '/crear' do
|
|
1569
1939
|
end
|
1570
1940
|
```
|
1571
1941
|
|
1572
|
-
Si
|
1942
|
+
Si quieres seguir usando una weak ETag, indicalo con la opción `:kind`:
|
1573
1943
|
|
1574
1944
|
```ruby
|
1575
1945
|
etag '', :new_resource => true, :kind => :weak
|
@@ -1577,7 +1947,7 @@ etag '', :new_resource => true, :kind => :weak
|
|
1577
1947
|
|
1578
1948
|
### Enviando Archivos
|
1579
1949
|
|
1580
|
-
Para enviar archivos,
|
1950
|
+
Para enviar archivos, puedes usar el método `send_file`:
|
1581
1951
|
|
1582
1952
|
```ruby
|
1583
1953
|
get '/' do
|
@@ -1593,33 +1963,33 @@ send_file 'foo.png', :type => :jpg
|
|
1593
1963
|
|
1594
1964
|
Estas opciones son:
|
1595
1965
|
|
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
|
-
|
1966
|
+
<dl>
|
1967
|
+
<dt>filename</dt>
|
1968
|
+
<dd>Nombre del archivo devuelto, por defecto es el nombre real del archivo.</dd>
|
1969
|
+
|
1970
|
+
<dt>last_modified</dt>
|
1971
|
+
<dd>Valor para el encabezado Last-Modified, por defecto toma el mtime del archivo.</dd>
|
1972
|
+
|
1973
|
+
<dt>type</dt>
|
1974
|
+
<dd>El Content-Type que se va a utilizar, si no está presente se intenta
|
1975
|
+
adivinar a partir de la extensión del archivo.</dd>
|
1976
|
+
|
1977
|
+
<dt>disposition</dt>
|
1978
|
+
<dd>
|
1979
|
+
Se utiliza para el encabezado Content-Disposition, y puede tomar alguno de los
|
1980
|
+
siguientes valores: <tt>nil</tt> (por defecto), <tt>:attachment</tt> y <tt>:inline</tt>
|
1981
|
+
</dd>
|
1982
|
+
|
1983
|
+
<dt>length</dt>
|
1984
|
+
<dd>Encabezado Content-Length, por defecto toma el tamaño del archivo</dd>
|
1985
|
+
|
1986
|
+
<dt>status</dt>
|
1987
|
+
<dd>
|
1988
|
+
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.
|
1989
|
+
</dd>
|
1990
|
+
</dl>
|
1621
1991
|
|
1622
|
-
### Accediendo al objeto
|
1992
|
+
### Accediendo al objeto Request
|
1623
1993
|
|
1624
1994
|
El objeto de la petición entrante puede ser accedido desde el nivel de la
|
1625
1995
|
petición (filtros, rutas y manejadores de errores) a través del método
|
@@ -1681,7 +2051,7 @@ end
|
|
1681
2051
|
|
1682
2052
|
### Archivos Adjuntos
|
1683
2053
|
|
1684
|
-
|
2054
|
+
Puedes usar el helper `attachment` para indicarle al navegador que
|
1685
2055
|
almacene la respuesta en el disco en lugar de mostrarla en pantalla:
|
1686
2056
|
|
1687
2057
|
```ruby
|
@@ -1691,7 +2061,7 @@ get '/' do
|
|
1691
2061
|
end
|
1692
2062
|
```
|
1693
2063
|
|
1694
|
-
También
|
2064
|
+
También puedes pasarle un nombre de archivo:
|
1695
2065
|
|
1696
2066
|
```ruby
|
1697
2067
|
get '/' do
|
@@ -1747,7 +2117,7 @@ find_template settings.views, 'foo', Tilt[:haml] do |archivo|
|
|
1747
2117
|
end
|
1748
2118
|
```
|
1749
2119
|
|
1750
|
-
Si bien esto no es muy útil, lo interesante es que
|
2120
|
+
Si bien esto no es muy útil, lo interesante es que puedes sobreescribir este
|
1751
2121
|
método, y así enganchar tu propio mecanismo de búsqueda. Por ejemplo, para
|
1752
2122
|
poder utilizar más de un directorio de vistas:
|
1753
2123
|
|
@@ -1803,7 +2173,7 @@ configure do
|
|
1803
2173
|
# atajo para `set :opcion, false`
|
1804
2174
|
disable :opcion
|
1805
2175
|
|
1806
|
-
# también
|
2176
|
+
# también puedes tener configuraciones dinámicas usando bloques
|
1807
2177
|
set(:css_dir) { File.join(views, 'css') }
|
1808
2178
|
end
|
1809
2179
|
```
|
@@ -1825,7 +2195,7 @@ configure :production, :test do
|
|
1825
2195
|
end
|
1826
2196
|
```
|
1827
2197
|
|
1828
|
-
|
2198
|
+
Puedes acceder a estas opciones utilizando el método `settings`:
|
1829
2199
|
|
1830
2200
|
```ruby
|
1831
2201
|
configure do
|
@@ -1839,11 +2209,11 @@ get '/' do
|
|
1839
2209
|
end
|
1840
2210
|
```
|
1841
2211
|
|
1842
|
-
### Configurando la Protección
|
2212
|
+
### Configurando la Protección Contra Ataques
|
1843
2213
|
|
1844
|
-
Sinatra usa [Rack::Protection](https://github.com/sinatra/rack-protection#readme)
|
2214
|
+
Sinatra usa [Rack::Protection](https://github.com/sinatra/sinatra/tree/master/rack-protection#readme)
|
1845
2215
|
para defender a tu aplicación de los ataques más comunes. Si por algún motivo,
|
1846
|
-
|
2216
|
+
quieres desactivar esta funcionalidad, puedes hacerlo como se indica a
|
1847
2217
|
continuación (ten en cuenta que tu aplicación va a quedar expuesta a un
|
1848
2218
|
montón de vulnerabilidades bien conocidas):
|
1849
2219
|
|
@@ -1872,22 +2242,22 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1872
2242
|
redirecciones relativas, sin embargo, como consecuencia
|
1873
2243
|
de esto, va a dejar de cumplir con el RFC 2616 (HTTP
|
1874
2244
|
1.1), que solamente permite redirecciones absolutas.
|
1875
|
-
|
2245
|
+
</dd>
|
2246
|
+
<dd>
|
1876
2247
|
Activalo si tu apliación está corriendo atrás de un proxy
|
1877
2248
|
reverso que no se ha configurado adecuadamente. Notá que
|
1878
2249
|
el helper <tt>url</tt> va a seguir produciendo URLs absolutas, a
|
1879
2250
|
menos que le pasés <tt>false</tt> como segundo parámetro.
|
1880
|
-
|
1881
|
-
|
2251
|
+
</dd>
|
2252
|
+
<dd>Deshabilitada por defecto.</dd>
|
1882
2253
|
</dd>
|
1883
2254
|
|
1884
2255
|
<dt>add_charset</dt>
|
1885
2256
|
<dd>
|
1886
2257
|
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:
|
2258
|
+
añade automáticamente el charset. En general, no deberías
|
2259
|
+
asignar directamente esta opción, sino añadirle los charsets
|
2260
|
+
que quieras:
|
1891
2261
|
<tt>settings.add_charset << "application/foobar"</tt>
|
1892
2262
|
</dd>
|
1893
2263
|
|
@@ -1901,7 +2271,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1901
2271
|
<dt>bind</dt>
|
1902
2272
|
<dd>
|
1903
2273
|
Dirección IP que utilizará el servidor integrado (por
|
1904
|
-
defecto: 0.0.0.0
|
2274
|
+
defecto: <tt>0.0.0.0</tt> <em>o</em> <tt>localhost</tt>
|
2275
|
+
si su `environment` está configurado para desarrollo).
|
1905
2276
|
</dd>
|
1906
2277
|
|
1907
2278
|
<dt>default_encoding</dt>
|
@@ -1931,7 +2302,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1931
2302
|
<dd>
|
1932
2303
|
Coloca un lock alrededor de cada petición, procesando
|
1933
2304
|
solamente una por proceso.
|
1934
|
-
|
2305
|
+
</dd>
|
2306
|
+
<dd>
|
1935
2307
|
Habilitá esta opción si tu aplicación no es thread-safe.
|
1936
2308
|
Se encuentra deshabilitada por defecto.
|
1937
2309
|
</dd>
|
@@ -1942,7 +2314,13 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1942
2314
|
formularios put/delete en navegadores que no los
|
1943
2315
|
soportan.
|
1944
2316
|
</dd>
|
1945
|
-
|
2317
|
+
|
2318
|
+
<dt>mustermann_opts</dt>
|
2319
|
+
<dd>
|
2320
|
+
Un hash predeterminado de opciones para pasar a Mustermann.new
|
2321
|
+
al compilar las rutas.
|
2322
|
+
</dd>
|
2323
|
+
|
1946
2324
|
<dt>port</dt>
|
1947
2325
|
<dd>
|
1948
2326
|
Puerto en el que escuchará el servidor integrado.
|
@@ -1960,16 +2338,8 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1960
2338
|
|
1961
2339
|
<dt>protection</dt>
|
1962
2340
|
<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.
|
2341
|
+
Define si se habilitan o no las protecciones de ataques web.
|
2342
|
+
Ver la sección de protección encima.
|
1973
2343
|
</dd>
|
1974
2344
|
|
1975
2345
|
<dt>public_folder</dt>
|
@@ -1980,12 +2350,17 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1980
2350
|
está presente, se infiere del valor de la opción
|
1981
2351
|
<tt>app_file</tt>.
|
1982
2352
|
</dd>
|
2353
|
+
|
2354
|
+
<dt>quiet</dt>
|
2355
|
+
<dd>
|
2356
|
+
Inhabilita los logs generados por los comandos de inicio y detención de Sinatra.
|
2357
|
+
<tt> false </tt> por defecto.
|
2358
|
+
</dd>
|
1983
2359
|
|
1984
2360
|
<dt>reload_templates</dt>
|
1985
2361
|
<dd>
|
1986
|
-
Define
|
1987
|
-
|
1988
|
-
Se encuentra activado en el entorno de desarrollo.
|
2362
|
+
Define Si se vuelven a cargar plantillas entre las solicitudes o no. Habilitado en
|
2363
|
+
modo de desarrollo.
|
1989
2364
|
</dd>
|
1990
2365
|
|
1991
2366
|
<dt>root</dt>
|
@@ -2022,6 +2397,11 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2022
2397
|
integrado. Por defecto: <tt>['thin', 'mongrel', 'webrick']</tt>,
|
2023
2398
|
el orden establece la prioridad.
|
2024
2399
|
</dd>
|
2400
|
+
|
2401
|
+
<dt>server_settings</dt>
|
2402
|
+
<dd>
|
2403
|
+
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 y Thin no son compatibles, por lo que puede establecer <tt> server_settings </tt> definiéndolo como un método cuando llame a <tt> configure </tt>.
|
2404
|
+
</dd>
|
2025
2405
|
|
2026
2406
|
<dt>sessions</dt>
|
2027
2407
|
<dd>
|
@@ -2029,6 +2409,13 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2029
2409
|
través de <tt>Rack::Session::Cookie</tt>. Ver la
|
2030
2410
|
sección 'Usando Sesiones' para más información.
|
2031
2411
|
</dd>
|
2412
|
+
|
2413
|
+
<dt>session_store</dt>
|
2414
|
+
<dd>
|
2415
|
+
Define el middleware de sesión Rack utilizado. Predeterminado a
|
2416
|
+
<tt>Rack::Session::Cookie</tt>. Consulte la sección 'Uso de sesiones' para obtener más información.
|
2417
|
+
información.
|
2418
|
+
</dd>
|
2032
2419
|
|
2033
2420
|
<dt>show_exceptions</dt>
|
2034
2421
|
<dd>
|
@@ -2037,17 +2424,19 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2037
2424
|
valor de <tt>environment</tt> es <tt>"development"</tt>.
|
2038
2425
|
En caso contrario estará desactivada.
|
2039
2426
|
</dd>
|
2427
|
+
<dd>
|
2428
|
+
También se puede establecer en <tt> :after_handler </tt> para activar la aplicación especificada
|
2429
|
+
que hara el manejo de errores antes de mostrar un stack trace en el navegador.
|
2430
|
+
</dd>
|
2040
2431
|
|
2041
2432
|
<dt>static</dt>
|
2042
2433
|
<dd>
|
2043
|
-
|
2044
|
-
|
2045
|
-
|
2046
|
-
|
2047
|
-
|
2048
|
-
|
2049
|
-
defecto en el estilo clásico y desactivado en el
|
2050
|
-
el modular.
|
2434
|
+
<dd> Define si Sinatra debe servir los archivos estáticos. </dd>
|
2435
|
+
<dd> Deshabilitar cuando se utiliza un servidor capaz de hacer esto por su cuenta. </dd>
|
2436
|
+
<dd> La desactivación aumentará el rendimiento. </dd>
|
2437
|
+
<dd>
|
2438
|
+
Habilitado por defecto en estilo clásico, deshabilitado para aplicaciones modulares.
|
2439
|
+
</dd>
|
2051
2440
|
</dd>
|
2052
2441
|
|
2053
2442
|
<dt>static_cache_control</dt>
|
@@ -2060,12 +2449,26 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2060
2449
|
utilizar un array cuando se asignan múltiples valores:
|
2061
2450
|
<tt>set :static_cache_control, [:public, :max_age => 300]</tt>.
|
2062
2451
|
</dd>
|
2452
|
+
|
2453
|
+
<dt>threaded</dt>
|
2454
|
+
<dd>
|
2455
|
+
Si se establece en <tt> true </tt>, le dirá a Thin que use
|
2456
|
+
<tt> EventMachine.defer </tt> para procesar la solicitud.
|
2457
|
+
</dd>
|
2458
|
+
|
2459
|
+
<dt> traps </dt>
|
2460
|
+
<dd> Define si Sinatra debería manejar las señales del sistema. </dd>
|
2063
2461
|
|
2064
2462
|
<dt>views</dt>
|
2065
2463
|
<dd>
|
2066
2464
|
Path del directorio de las vistas. Si no está presente,
|
2067
2465
|
se infiere del valor de la opción <tt>app_file</tt>.
|
2068
2466
|
</dd>
|
2467
|
+
<dt>x_cascade</dt>
|
2468
|
+
<dd>
|
2469
|
+
Establece o no el encabezado de X-Cascade si no hay una coincidencia de ruta.
|
2470
|
+
<tt> verdadero </tt> por defecto.
|
2471
|
+
</dd>
|
2069
2472
|
</dl>
|
2070
2473
|
|
2071
2474
|
## Entornos
|
@@ -2080,23 +2483,31 @@ de `production` y `test`, donde se cachean.
|
|
2080
2483
|
especiales que muestran un stack trace en el navegador cuando son disparados.
|
2081
2484
|
|
2082
2485
|
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
|
-
|
2486
|
+
correspondiente a la variable de entorno `APP_ENV`:
|
2086
2487
|
```shell
|
2087
|
-
ruby
|
2488
|
+
APP_ENV=production ruby my_app.rb
|
2088
2489
|
```
|
2089
2490
|
|
2090
2491
|
Los métodos `development?`, `test?` y `production?` te permiten conocer el
|
2091
2492
|
entorno actual.
|
2092
2493
|
|
2494
|
+
```ruby
|
2495
|
+
get '/' do
|
2496
|
+
if settings.development?
|
2497
|
+
"development!"
|
2498
|
+
else
|
2499
|
+
"not development!"
|
2500
|
+
end
|
2501
|
+
end
|
2502
|
+
```
|
2503
|
+
|
2093
2504
|
## Manejo de Errores
|
2094
2505
|
|
2095
2506
|
Los manejadores de errores se ejecutan dentro del mismo contexto que las rutas
|
2096
|
-
y los filtros `before`, lo que significa que
|
2507
|
+
y los filtros `before`, lo que significa que puedes usar, por ejemplo,
|
2097
2508
|
`haml`, `erb`, `halt`, etc.
|
2098
2509
|
|
2099
|
-
###
|
2510
|
+
### Not Found
|
2100
2511
|
|
2101
2512
|
Cuando se eleva una excepción `Sinatra::NotFound`, o el código de
|
2102
2513
|
estado de la respuesta es 404, el manejador `not_found` es invocado:
|
@@ -2135,11 +2546,13 @@ get '/' do
|
|
2135
2546
|
end
|
2136
2547
|
```
|
2137
2548
|
|
2138
|
-
|
2549
|
+
Obtienes esto:
|
2139
2550
|
|
2551
|
+
```
|
2140
2552
|
Lo que pasó fue... algo malo
|
2553
|
+
```
|
2141
2554
|
|
2142
|
-
También,
|
2555
|
+
También, puedes instalar un manejador de errores para un código de estado:
|
2143
2556
|
|
2144
2557
|
```ruby
|
2145
2558
|
error 403 do
|
@@ -2160,7 +2573,8 @@ end
|
|
2160
2573
|
```
|
2161
2574
|
|
2162
2575
|
Sinatra instala manejadores `not_found` y `error` especiales
|
2163
|
-
cuando se ejecuta dentro del entorno de desarrollo "development"
|
2576
|
+
cuando se ejecuta dentro del entorno de desarrollo "development" y se muestran
|
2577
|
+
en tu navegador para que tengas información adicional sobre el error.
|
2164
2578
|
|
2165
2579
|
## Rack Middleware
|
2166
2580
|
|
@@ -2187,7 +2601,7 @@ end
|
|
2187
2601
|
```
|
2188
2602
|
|
2189
2603
|
La semántica de `use` es idéntica a la definida para el DSL
|
2190
|
-
Rack::Builder
|
2604
|
+
[Rack::Builder](http://www.rubydoc.info/github/rack/rack/master/Rack/Builder) (más
|
2191
2605
|
frecuentemente usado en archivos rackup). Por ejemplo, el método `use`
|
2192
2606
|
acepta argumentos múltiples/variables así como bloques:
|
2193
2607
|
|
@@ -2202,7 +2616,7 @@ debugging, enrutamiento URL, autenticación y manejo de sesiones. Sinatra
|
|
2202
2616
|
usa muchos de estos componentes automáticamente de acuerdo a su configuración
|
2203
2617
|
para que usualmente no tengas que usarlas (con `use`) explícitamente.
|
2204
2618
|
|
2205
|
-
|
2619
|
+
Puedes encontrar middleware útil en
|
2206
2620
|
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
2207
2621
|
[rack-contrib](https://github.com/rack/rack-contrib#readme),
|
2208
2622
|
o en la [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
|
@@ -2242,6 +2656,9 @@ class MiAppTest < Minitest::Test
|
|
2242
2656
|
end
|
2243
2657
|
```
|
2244
2658
|
|
2659
|
+
Nota: Si está utilizando Sinatra en el estilo modular, reemplace
|
2660
|
+
`Sinatra::Application` anterior con el nombre de clase de su aplicación.
|
2661
|
+
|
2245
2662
|
## Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares
|
2246
2663
|
|
2247
2664
|
Definir tu aplicación en el nivel superior funciona bien para micro-aplicaciones
|
@@ -2281,6 +2698,19 @@ aplicaciones top-level se pueden convertir en componentes
|
|
2281
2698
|
desactivadas por defecto, incluyendo el servidor incorporado. Mirá
|
2282
2699
|
[Opciones y Configuraciones](http://www.sinatrarb.com/configuration.html)
|
2283
2700
|
para detalles sobre las opciones disponibles y su comportamiento.
|
2701
|
+
Si quieres un comportamiento más similar
|
2702
|
+
a cuando defines tu aplicación en el nivel superior (también conocido como Clásico)
|
2703
|
+
estilo), puede subclase `Sinatra::Aplicación`
|
2704
|
+
|
2705
|
+
```ruby
|
2706
|
+
require 'sinatra/base'
|
2707
|
+
|
2708
|
+
class MiAplicacion < Sinatra::Application
|
2709
|
+
get '/' do
|
2710
|
+
'Hola Mundo!'
|
2711
|
+
end
|
2712
|
+
end
|
2713
|
+
```
|
2284
2714
|
|
2285
2715
|
### Estilo Modular vs. Clásico
|
2286
2716
|
|
@@ -2288,7 +2718,7 @@ Contrariamente a la creencia popular, no hay nada de malo con el estilo clásico
|
|
2288
2718
|
Si se ajusta a tu aplicación, no es necesario que la cambies a una modular.
|
2289
2719
|
|
2290
2720
|
La desventaja de usar el estilo clásico en lugar del modular consiste en que
|
2291
|
-
solamente
|
2721
|
+
solamente puedes tener una aplicación Sinatra por proceso Ruby. Si tienes
|
2292
2722
|
planificado usar más, cambiá al estilo modular. Al mismo tiempo, ten en
|
2293
2723
|
cuenta que no hay ninguna razón por la cuál no puedas mezclar los estilos
|
2294
2724
|
clásico y modular.
|
@@ -2298,45 +2728,52 @@ de ambos estilos:
|
|
2298
2728
|
|
2299
2729
|
<table>
|
2300
2730
|
<tr>
|
2301
|
-
<
|
2302
|
-
<
|
2303
|
-
<
|
2731
|
+
<th>Configuración</th>
|
2732
|
+
<th>Clásica</th>
|
2733
|
+
<th>Modular</th>
|
2734
|
+
<th>Modular</th>
|
2304
2735
|
</tr>
|
2305
2736
|
|
2306
2737
|
<tr>
|
2307
2738
|
<td>app_file</td>
|
2308
2739
|
<td>archivo que carga sinatra</td>
|
2309
2740
|
<td>archivo con la subclase de Sinatra::Base</td>
|
2741
|
+
<td>archivo con la subclase Sinatra::Application</td>
|
2310
2742
|
</tr>
|
2311
2743
|
|
2312
2744
|
<tr>
|
2313
2745
|
<td>run</td>
|
2314
2746
|
<td>$0 == app_file</td>
|
2315
2747
|
<td>false</td>
|
2748
|
+
<td>false</td>
|
2316
2749
|
</tr>
|
2317
2750
|
|
2318
2751
|
<tr>
|
2319
2752
|
<td>logging</td>
|
2320
2753
|
<td>true</td>
|
2321
2754
|
<td>false</td>
|
2755
|
+
<td>true</td>
|
2322
2756
|
</tr>
|
2323
2757
|
|
2324
2758
|
<tr>
|
2325
2759
|
<td>method_override</td>
|
2326
2760
|
<td>true</td>
|
2327
2761
|
<td>false</td>
|
2762
|
+
<td>true</td>
|
2328
2763
|
</tr>
|
2329
2764
|
|
2330
2765
|
<tr>
|
2331
2766
|
<td>inline_templates</td>
|
2332
2767
|
<td>true</td>
|
2333
2768
|
<td>false</td>
|
2769
|
+
<td>true</td>
|
2334
2770
|
</tr>
|
2335
2771
|
|
2336
2772
|
<tr>
|
2337
2773
|
<td>static</td>
|
2338
2774
|
<td>true</td>
|
2339
2775
|
<td>File.exist?(public_folder)</td>
|
2776
|
+
<td>true</td>
|
2340
2777
|
</tr>
|
2341
2778
|
</table>
|
2342
2779
|
|
@@ -2399,15 +2836,15 @@ run Sinatra::Application
|
|
2399
2836
|
|
2400
2837
|
### ¿Cuándo usar config.ru?
|
2401
2838
|
|
2402
|
-
Indicadores de que probablemente
|
2839
|
+
Indicadores de que probablemente quieres usar `config.ru`:
|
2403
2840
|
|
2404
|
-
*
|
2841
|
+
* Quieres realizar el deploy con un handler Rack distinto (Passenger, Unicorn,
|
2405
2842
|
Heroku, ...).
|
2406
|
-
*
|
2407
|
-
*
|
2843
|
+
* Quieres usar más de una subclase de `Sinatra::Base`.
|
2844
|
+
* Quieres usar Sinatra únicamente para middleware, pero no como un endpoint.
|
2408
2845
|
|
2409
2846
|
<b>No hay necesidad de utilizar un archivo `config.ru` exclusivamente
|
2410
|
-
porque
|
2847
|
+
porque tienes una aplicación modular, y no necesitás una aplicación modular para
|
2411
2848
|
iniciarla con `config.ru`.</b>
|
2412
2849
|
|
2413
2850
|
### Utilizando Sinatra como Middleware
|
@@ -2452,7 +2889,7 @@ end
|
|
2452
2889
|
|
2453
2890
|
Puede que en algunas ocasiones quieras crear nuevas aplicaciones en
|
2454
2891
|
tiempo de ejecución sin tener que asignarlas a una constante. Para
|
2455
|
-
esto
|
2892
|
+
esto tienes `Sinatra.new`:
|
2456
2893
|
|
2457
2894
|
```ruby
|
2458
2895
|
require 'sinatra/base'
|
@@ -2499,7 +2936,7 @@ run ProyectoRails::Application
|
|
2499
2936
|
|
2500
2937
|
## Ámbitos y Ligaduras
|
2501
2938
|
|
2502
|
-
El ámbito en el que te
|
2939
|
+
El ámbito en el que te encuentras determina que métodos y variables están
|
2503
2940
|
disponibles.
|
2504
2941
|
|
2505
2942
|
### Ámbito de Aplicación/Clase
|
@@ -2507,8 +2944,8 @@ disponibles.
|
|
2507
2944
|
Cada aplicación Sinatra es una subclase de `Sinatra::Base`. Si estás
|
2508
2945
|
usando el DSL de top-level (`require 'sinatra'`), entonces esta clase es
|
2509
2946
|
`Sinatra::Application`, de otra manera es la subclase que creaste
|
2510
|
-
explícitamente. Al nivel de la clase
|
2511
|
-
no
|
2947
|
+
explícitamente. Al nivel de la clase tienes métodos como `get` o `before`, pero
|
2948
|
+
no puedes acceder a los objetos `request` o `session`, ya que hay una única
|
2512
2949
|
clase de la aplicación para todas las peticiones.
|
2513
2950
|
|
2514
2951
|
Las opciones creadas utilizando `set` son métodos al nivel de la clase:
|
@@ -2525,12 +2962,13 @@ class MiApp < Sinatra::Base
|
|
2525
2962
|
end
|
2526
2963
|
```
|
2527
2964
|
|
2528
|
-
|
2965
|
+
Tienes la ligadura al ámbito de la aplicación dentro de:
|
2529
2966
|
|
2530
2967
|
* El cuerpo de la clase de tu aplicación
|
2531
2968
|
* Métodos definidos por extensiones
|
2532
2969
|
* El bloque pasado a `helpers`
|
2533
2970
|
* Procs/bloques usados como el valor para `set`
|
2971
|
+
* El bloque pasado a `Sinatra.new`
|
2534
2972
|
|
2535
2973
|
Este ámbito puede alcanzarse de las siguientes maneras:
|
2536
2974
|
|
@@ -2541,8 +2979,8 @@ Este ámbito puede alcanzarse de las siguientes maneras:
|
|
2541
2979
|
|
2542
2980
|
Para cada petición entrante, una nueva instancia de la clase de tu aplicación
|
2543
2981
|
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`.
|
2982
|
+
ámbito puedes acceder a los objetos `request` y `session` o llamar a los métodos
|
2983
|
+
de renderización como `erb` o `haml`. Puedes acceder al ámbito de la aplicación
|
2546
2984
|
desde el ámbito de la petición utilizando `settings`:
|
2547
2985
|
|
2548
2986
|
```ruby
|
@@ -2562,23 +3000,23 @@ class MiApp < Sinatra::Base
|
|
2562
3000
|
end
|
2563
3001
|
```
|
2564
3002
|
|
2565
|
-
|
3003
|
+
Tienes la ligadura al ámbito de la petición dentro de:
|
2566
3004
|
|
2567
|
-
* bloques pasados a get
|
3005
|
+
* bloques pasados a get, head, post, put, delete, options, patch, link y unlink
|
2568
3006
|
* filtros before/after
|
2569
|
-
* métodos
|
3007
|
+
* métodos helpers
|
2570
3008
|
* plantillas/vistas
|
2571
3009
|
|
2572
3010
|
### Ámbito de Delegación
|
2573
3011
|
|
2574
3012
|
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
|
3013
|
+
manera, no se comporta 100% como el ámbito de clase porque no tienes la ligadura
|
2576
3014
|
de la clase: únicamente métodos marcados explícitamente para delegación están
|
2577
3015
|
disponibles y no compartís variables/estado con el ámbito de clase (léase:
|
2578
|
-
|
3016
|
+
tienes un `self` diferente). Puedes agregar delegaciones de método llamando a
|
2579
3017
|
`Sinatra::Delegator.delegate :nombre_del_metodo`.
|
2580
3018
|
|
2581
|
-
|
3019
|
+
Tienes és la ligadura al ámbito de delegación dentro de:
|
2582
3020
|
|
2583
3021
|
* La ligadura del top-level, si hiciste `require "sinatra"`
|
2584
3022
|
* Un objeto extendido con el mixin `Sinatra::Delegator`
|
@@ -2592,7 +3030,7 @@ que [extiende el objeto main](https://github.com/sinatra/sinatra/blob/ca06364/li
|
|
2592
3030
|
Las aplicaciones Sinatra pueden ser ejecutadas directamente:
|
2593
3031
|
|
2594
3032
|
```shell
|
2595
|
-
ruby
|
3033
|
+
ruby myapp.rb [-h] [-x] [-q] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]
|
2596
3034
|
```
|
2597
3035
|
|
2598
3036
|
Las opciones son:
|
@@ -2603,12 +3041,13 @@ Las opciones son:
|
|
2603
3041
|
-o # asigna el host (0.0.0.0 es usado por defecto)
|
2604
3042
|
-e # asigna el entorno (development es usado por defecto)
|
2605
3043
|
-s # especifica el servidor/manejador rack (thin es usado por defecto)
|
3044
|
+
-q # activar el modo silecioso para el servidor (está desactivado por defecto)
|
2606
3045
|
-x # activa el mutex lock (está desactivado por defecto)
|
2607
3046
|
```
|
2608
3047
|
|
2609
3048
|
### Multi-threading
|
2610
3049
|
|
2611
|
-
_Basado en [esta respuesta en StackOverflow]
|
3050
|
+
_Basado en [esta respuesta en StackOverflow](http://stackoverflow.com/questions/6278817/is-sinatra-multi-threaded/6282999#6282999) escrita por Konstantin_
|
2612
3051
|
|
2613
3052
|
Sinatra no impone ningún modelo de concurrencia, sino que lo deja en manos del
|
2614
3053
|
handler Rack que se esté usando (Thin, Puma, WEBrick). Sinatra en sí mismo es
|
@@ -2639,58 +3078,33 @@ Para arrancar el servidor, el comando sería:
|
|
2639
3078
|
thin --threaded start
|
2640
3079
|
```
|
2641
3080
|
|
2642
|
-
|
2643
|
-
|
2644
|
-
## Versiones de Ruby Soportadas
|
3081
|
+
## Requerimientos
|
2645
3082
|
|
2646
3083
|
Las siguientes versiones de Ruby son soportadas oficialmente:
|
2647
3084
|
|
2648
3085
|
<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>
|
3086
|
+
<dt>Ruby 2.2</dt>
|
3087
|
+
<dd>
|
3088
|
+
2.2 Es totalmente compatible y recomendado. Actualmente no hay planes
|
3089
|
+
soltar el apoyo oficial para ello.
|
3090
|
+
</dd>
|
2675
3091
|
|
2676
3092
|
<dt>Rubinius</dt>
|
2677
3093
|
<dd>
|
2678
|
-
Rubinius es
|
2679
|
-
|
2680
|
-
2.0, también es soportada, incluyendo el modo 1.9.
|
3094
|
+
Rubinius es oficialmente compatible (Rubinius> = 2.x). Se recomienda instalar la gema puma
|
3095
|
+
<tt>gem install puma</tt>.
|
2681
3096
|
</dd>
|
2682
3097
|
|
2683
3098
|
<dt>JRuby</dt>
|
2684
3099
|
<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.
|
3100
|
+
La última versión estable de JRuby es oficialmente compatible. No lo es
|
3101
|
+
recomienda usar extensiones C con JRuby. Se recomienda instalar la gema trinidad
|
3102
|
+
<tt> gem install trinidad </tt>.
|
2691
3103
|
</dd>
|
2692
3104
|
</dl>
|
2693
3105
|
|
3106
|
+
Las versiones de Ruby anteriores a 2.2.2 ya no son compatibles con Sinatra 2.0 .
|
3107
|
+
|
2694
3108
|
Siempre le prestamos atención a las nuevas versiones de Ruby.
|
2695
3109
|
|
2696
3110
|
Las siguientes implementaciones de Ruby no se encuentran soportadas
|
@@ -2705,23 +3119,24 @@ No ser soportada oficialmente, significa que si las cosas se rompen
|
|
2705
3119
|
ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
|
2706
3120
|
el suyo.
|
2707
3121
|
|
2708
|
-
|
2709
|
-
|
2710
|
-
|
2711
|
-
|
3122
|
+
También ejecutamos nuestro CI contra ruby-head (futuras versiones de MRI), pero
|
3123
|
+
no puede garantizar nada, ya que se mueve constantemente. Esperar próxima
|
3124
|
+
2.x versiones para ser totalmente compatibles.
|
3125
|
+
|
3126
|
+
Sinatra debería trabajar en cualquier sistema operativo compatible la implementación de Ruby
|
3127
|
+
elegida
|
2712
3128
|
|
2713
|
-
|
2714
|
-
implementación de Ruby elegida.
|
3129
|
+
Si ejecuta MacRuby, debe `gem install control_tower`.
|
2715
3130
|
|
2716
|
-
|
2717
|
-
|
3131
|
+
Sinatra actualmente no funciona con Cardinal, SmallRuby, BlueRuby o cualquier
|
3132
|
+
versión de Ruby anterior a 2.2.
|
2718
3133
|
|
2719
3134
|
## A la Vanguardia
|
2720
3135
|
|
2721
|
-
Si
|
3136
|
+
Si quieres usar el código de Sinatra más reciente, sientete libre de ejecutar
|
2722
3137
|
tu aplicación sobre la rama master, en general es bastante estable.
|
2723
3138
|
|
2724
|
-
También liberamos prereleases de vez en cuando, así,
|
3139
|
+
También liberamos prereleases de vez en cuando, así, puedes hacer:
|
2725
3140
|
|
2726
3141
|
```shell
|
2727
3142
|
gem install sinatra --pre
|
@@ -2729,12 +3144,12 @@ gem install sinatra --pre
|
|
2729
3144
|
|
2730
3145
|
Para obtener algunas de las últimas características.
|
2731
3146
|
|
2732
|
-
###
|
3147
|
+
### Usando Bundler
|
2733
3148
|
|
2734
3149
|
Esta es la manera recomendada para ejecutar tu aplicación sobre la última
|
2735
3150
|
versión de Sinatra usando [Bundler](http://bundler.io).
|
2736
3151
|
|
2737
|
-
Primero,
|
3152
|
+
Primero, instala Bundler si no lo hiciste todavía:
|
2738
3153
|
|
2739
3154
|
```shell
|
2740
3155
|
gem install bundler
|
@@ -2748,54 +3163,18 @@ gem 'sinatra', :git => "git://github.com/sinatra/sinatra.git"
|
|
2748
3163
|
|
2749
3164
|
# otras dependencias
|
2750
3165
|
gem 'haml' # por ejemplo, si usás haml
|
2751
|
-
gem 'activerecord', '~> 3.0' # quizás también necesités ActiveRecord 3.x
|
2752
3166
|
```
|
2753
3167
|
|
2754
|
-
|
3168
|
+
Ten en cuenta que tienes que listar todas las dependencias directas de tu
|
2755
3169
|
aplicación. No es necesario listar las dependencias de Sinatra (Rack y Tilt)
|
2756
3170
|
porque Bundler las agrega directamente.
|
2757
3171
|
|
2758
|
-
Ahora
|
3172
|
+
Ahora puedes arrancar tu aplicación así:
|
2759
3173
|
|
2760
3174
|
```shell
|
2761
3175
|
bundle exec ruby miapp.rb
|
2762
3176
|
```
|
2763
3177
|
|
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
3178
|
## Versionado
|
2800
3179
|
|
2801
3180
|
Sinatra utiliza el [Versionado Semántico](http://semver.org/),
|
@@ -2806,11 +3185,13 @@ siguiendo las especificaciones SemVer y SemVerTag.
|
|
2806
3185
|
* [Sito web del proyecto](http://www.sinatrarb.com/) - Documentación
|
2807
3186
|
adicional, noticias, y enlaces a otros recursos.
|
2808
3187
|
* [Contribuyendo](http://www.sinatrarb.com/contributing) - ¿Encontraste un
|
2809
|
-
error?. ¿
|
3188
|
+
error?. ¿Necesitas ayuda?. ¿Tienes un parche?.
|
2810
3189
|
* [Seguimiento de problemas](https://github.com/sinatra/sinatra/issues)
|
2811
3190
|
* [Twitter](https://twitter.com/sinatra)
|
2812
3191
|
* [Lista de Correo](http://groups.google.com/group/sinatrarb/topics)
|
2813
3192
|
* [IRC: #sinatra](irc://chat.freenode.net/#sinatra) en http://freenode.net
|
3193
|
+
* [Sinatra & Friends](https://sinatrarb.slack.com) en Slack y revisa
|
3194
|
+
[acá](https://sinatra-slack.herokuapp.com/) Para una invitación.
|
2814
3195
|
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) Tutorial (en inglés).
|
2815
3196
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) Recetas contribuidas
|
2816
3197
|
por la comunidad (en inglés).
|