sinatra 1.4.5 → 1.4.6
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of sinatra might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/AUTHORS.md +77 -0
- data/CHANGES +30 -0
- data/Gemfile +5 -5
- data/README.de.md +186 -56
- data/README.es.md +76 -76
- data/README.fr.md +120 -56
- data/README.hu.md +19 -19
- data/README.ja.md +44 -46
- data/README.ko.md +163 -67
- data/README.md +151 -127
- data/README.pt-br.md +905 -144
- data/README.pt-pt.md +17 -17
- data/README.ru.md +88 -52
- data/README.zh.md +76 -68
- data/lib/sinatra.rb +0 -1
- data/lib/sinatra/base.rb +21 -15
- data/lib/sinatra/show_exceptions.rb +10 -4
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +1 -1
- data/test/asciidoctor_test.rb +2 -2
- data/test/base_test.rb +1 -5
- data/test/builder_test.rb +2 -2
- data/test/coffee_test.rb +8 -2
- data/test/compile_test.rb +1 -1
- data/test/contest.rb +3 -12
- data/test/creole_test.rb +2 -2
- data/test/delegator_test.rb +1 -1
- data/test/encoding_test.rb +1 -1
- data/test/erb_test.rb +1 -1
- data/test/extensions_test.rb +1 -1
- data/test/filter_test.rb +2 -2
- data/test/haml_test.rb +2 -2
- data/test/helper.rb +8 -7
- data/test/helpers_test.rb +6 -6
- data/test/integration_test.rb +3 -3
- data/test/less_test.rb +2 -2
- data/test/liquid_test.rb +3 -3
- data/test/mapped_error_test.rb +5 -5
- data/test/markaby_test.rb +2 -2
- data/test/markdown_test.rb +6 -3
- data/test/mediawiki_test.rb +2 -2
- data/test/middleware_test.rb +1 -1
- data/test/nokogiri_test.rb +2 -2
- data/test/rabl_test.rb +2 -2
- data/test/rack_test.rb +1 -1
- data/test/radius_test.rb +2 -2
- data/test/rdoc_test.rb +4 -4
- data/test/readme_test.rb +1 -1
- data/test/request_test.rb +4 -1
- data/test/response_test.rb +1 -1
- data/test/result_test.rb +2 -2
- data/test/route_added_hook_test.rb +1 -1
- data/test/routing_test.rb +7 -7
- data/test/sass_test.rb +3 -3
- data/test/scss_test.rb +2 -2
- data/test/server_test.rb +10 -2
- data/test/settings_test.rb +4 -4
- data/test/sinatra_test.rb +1 -1
- data/test/slim_test.rb +2 -2
- data/test/static_test.rb +2 -2
- data/test/streaming_test.rb +2 -2
- data/test/stylus_test.rb +2 -2
- data/test/templates_test.rb +3 -3
- data/test/textile_test.rb +2 -2
- data/test/wlang_test.rb +1 -1
- data/test/yajl_test.rb +2 -2
- metadata +10 -11
- data/AUTHORS +0 -61
data/README.es.md
CHANGED
@@ -75,8 +75,8 @@ través del hash `params`:
|
|
75
75
|
``` ruby
|
76
76
|
get '/hola/:nombre' do
|
77
77
|
# coincide con "GET /hola/foo" y "GET /hola/bar"
|
78
|
-
# params[
|
79
|
-
"Hola #{params[
|
78
|
+
# params['nombre'] es 'foo' o 'bar'
|
79
|
+
"Hola #{params['nombre']}!"
|
80
80
|
end
|
81
81
|
```
|
82
82
|
|
@@ -85,24 +85,24 @@ También puede acceder a los parámetros nombrados usando parámetros de bloque:
|
|
85
85
|
``` ruby
|
86
86
|
get '/hola/:nombre' do |n|
|
87
87
|
# coincide con "GET /hola/foo" y "GET /hola/bar"
|
88
|
-
# params[
|
89
|
-
# n almacena params[
|
88
|
+
# params['nombre'] es 'foo' o 'bar'
|
89
|
+
# n almacena params['nombre']
|
90
90
|
"Hola #{n}!"
|
91
91
|
end
|
92
92
|
```
|
93
93
|
|
94
94
|
Los patrones de ruta también pueden incluir parámetros splat (o wildcard),
|
95
|
-
accesibles a través del arreglo `params[
|
95
|
+
accesibles a través del arreglo `params['splat']`:
|
96
96
|
|
97
97
|
``` ruby
|
98
98
|
get '/decir/*/al/*' do
|
99
99
|
# coincide con /decir/hola/al/mundo
|
100
|
-
params[
|
100
|
+
params['splat'] # => ["hola", "mundo"]
|
101
101
|
end
|
102
102
|
|
103
103
|
get '/descargar/*.*' do
|
104
104
|
# coincide con /descargar/path/al/archivo.xml
|
105
|
-
params[
|
105
|
+
params['splat'] # => ["path/al/archivo", "xml"]
|
106
106
|
end
|
107
107
|
```
|
108
108
|
|
@@ -117,8 +117,8 @@ end
|
|
117
117
|
Rutas con Expresiones Regulares:
|
118
118
|
|
119
119
|
``` ruby
|
120
|
-
get
|
121
|
-
"Hola, #{params[
|
120
|
+
get /\A\/hola\/([\w]+)\z/ do
|
121
|
+
"Hola, #{params['captures'].first}!"
|
122
122
|
end
|
123
123
|
```
|
124
124
|
|
@@ -150,11 +150,11 @@ ejemplo el user agent:
|
|
150
150
|
|
151
151
|
``` ruby
|
152
152
|
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
|
153
|
-
"Estás usando la versión de Songbird #{params[
|
153
|
+
"Estás usando la versión de Songbird #{params['agent'][0]}"
|
154
154
|
end
|
155
155
|
|
156
156
|
get '/foo' do
|
157
|
-
# Coincide con
|
157
|
+
# Coincide con navegadores que no sean songbird
|
158
158
|
end
|
159
159
|
```
|
160
160
|
|
@@ -336,8 +336,8 @@ get '/' do
|
|
336
336
|
end
|
337
337
|
```
|
338
338
|
|
339
|
-
Renderiza `views/index.erb`
|
340
|
-
defecto, la plantilla `:index` es
|
339
|
+
Renderiza `views/index.erb` incrustado en `views/post.erb` (por
|
340
|
+
defecto, la plantilla `:index` es incrustada en `views/layout.erb` siempre y
|
341
341
|
cuando este último archivo exista).
|
342
342
|
|
343
343
|
Cualquier opción que Sinatra no entienda le será pasada al motor de renderizado
|
@@ -483,7 +483,7 @@ get('/') { markdown :index }
|
|
483
483
|
<tr>
|
484
484
|
<td>Dependencias</td>
|
485
485
|
<td>
|
486
|
-
<a href="
|
486
|
+
<a href="https://github.com/jimweirich/builder" title="builder">builder</a>
|
487
487
|
</td>
|
488
488
|
</tr>
|
489
489
|
<tr>
|
@@ -496,7 +496,7 @@ get('/') { markdown :index }
|
|
496
496
|
</tr>
|
497
497
|
</table>
|
498
498
|
|
499
|
-
Además, acepta un bloque con la definición de la plantilla (ver
|
499
|
+
Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
|
500
500
|
|
501
501
|
### Plantillas Nokogiri
|
502
502
|
|
@@ -515,7 +515,7 @@ Además, acepta un bloque con la definición de la plantilla (ver el ejemplo).
|
|
515
515
|
</tr>
|
516
516
|
</table>
|
517
517
|
|
518
|
-
Además, acepta un bloque con la definición de la plantilla (ver
|
518
|
+
Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
|
519
519
|
|
520
520
|
### Plantillas Sass
|
521
521
|
|
@@ -597,8 +597,8 @@ plantilla Liquid, casi siempre va a querer pasarle locales.
|
|
597
597
|
<a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>,
|
598
598
|
<a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>,
|
599
599
|
<a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>,
|
600
|
-
<a href="http://kramdown.
|
601
|
-
<a href="
|
600
|
+
<a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a> o
|
601
|
+
<a href="https://github.com/bhollis/maruku" title="maruku">maruku</a>
|
602
602
|
</td>
|
603
603
|
</tr>
|
604
604
|
<tr>
|
@@ -671,7 +671,7 @@ layout distinto al de la plantilla pasando la opción `:layout_engine`.
|
|
671
671
|
<table>
|
672
672
|
<tr>
|
673
673
|
<td>Dependencias</td>
|
674
|
-
<td><a href="http://rdoc.
|
674
|
+
<td><a href="http://rdoc.sourceforge.net/" title="RDoc">RDoc</a></td>
|
675
675
|
</tr>
|
676
676
|
<tr>
|
677
677
|
<td>Extensiones de Archivo</td>
|
@@ -707,7 +707,7 @@ al de la plantilla pasando la opción `:layout_engine`.
|
|
707
707
|
<table>
|
708
708
|
<tr>
|
709
709
|
<td>Dependencias</td>
|
710
|
-
<td><a href="
|
710
|
+
<td><a href="https://github.com/jlong/radius" title="Radius">Radius</a></td>
|
711
711
|
</tr>
|
712
712
|
<tr>
|
713
713
|
<td>Extensiones de Archivo</td>
|
@@ -719,7 +719,7 @@ al de la plantilla pasando la opción `:layout_engine`.
|
|
719
719
|
</tr>
|
720
720
|
</table>
|
721
721
|
|
722
|
-
Desde que no se puede
|
722
|
+
Desde que no se puede utilizar métodos de Ruby (excepto por `yield`) de una
|
723
723
|
plantilla Radius, casi siempre se necesita pasar locales.
|
724
724
|
|
725
725
|
### Plantillas Markaby
|
@@ -739,7 +739,7 @@ plantilla Radius, casi siempre se necesita pasar locales.
|
|
739
739
|
</tr>
|
740
740
|
</table>
|
741
741
|
|
742
|
-
Además, acepta un bloque con la definición de la plantilla (ver
|
742
|
+
Además, acepta un bloque con la definición de la plantilla (ver ejemplo).
|
743
743
|
|
744
744
|
### Plantillas RABL
|
745
745
|
|
@@ -808,7 +808,7 @@ plantillas:
|
|
808
808
|
```
|
809
809
|
|
810
810
|
Como no podés utilizar Ruby desde Creole, no podés usar layouts escritos en
|
811
|
-
|
811
|
+
Creole. De todos modos, es posible usar un motor de renderizado para el layout
|
812
812
|
distinto al de la plantilla pasando la opción `:layout_engine`.
|
813
813
|
|
814
814
|
### Plantillas CoffeeScript
|
@@ -883,7 +883,7 @@ distinto al de la plantilla pasando la opción `:layout_engine`.
|
|
883
883
|
</tr>
|
884
884
|
</table>
|
885
885
|
|
886
|
-
El contenido de
|
886
|
+
El contenido de la plantilla se evalúa como código Ruby, y la variable `json` es convertida a JSON mediante `#to_json`.
|
887
887
|
|
888
888
|
``` ruby
|
889
889
|
json = { :foo => 'bar' }
|
@@ -934,7 +934,7 @@ accesibles directamente por las plantillas:
|
|
934
934
|
|
935
935
|
``` ruby
|
936
936
|
get '/:id' do
|
937
|
-
@foo = Foo.find(params[
|
937
|
+
@foo = Foo.find(params['id'])
|
938
938
|
haml '%h1= @foo.nombre'
|
939
939
|
end
|
940
940
|
```
|
@@ -943,7 +943,7 @@ O es posible especificar un Hash de variables locales explícitamente:
|
|
943
943
|
|
944
944
|
``` ruby
|
945
945
|
get '/:id' do
|
946
|
-
foo = Foo.find(params[
|
946
|
+
foo = Foo.find(params['id'])
|
947
947
|
haml '%h1= bar.nombre', :locals => { :bar => foo }
|
948
948
|
end
|
949
949
|
```
|
@@ -974,7 +974,7 @@ __END__
|
|
974
974
|
```
|
975
975
|
|
976
976
|
NOTA: únicamente las plantillas inline definidas en el archivo fuente que
|
977
|
-
requiere
|
977
|
+
requiere Sinatra son cargadas automáticamente. Llamá `enable
|
978
978
|
:inline_templates` explícitamente si tenés plantillas inline en otros
|
979
979
|
archivos fuente.
|
980
980
|
|
@@ -1052,7 +1052,7 @@ end
|
|
1052
1052
|
|
1053
1053
|
get '/foo/*' do
|
1054
1054
|
@nota #=> 'Hey!'
|
1055
|
-
params[
|
1055
|
+
params['splat'] #=> 'bar/baz'
|
1056
1056
|
end
|
1057
1057
|
```
|
1058
1058
|
|
@@ -1110,7 +1110,7 @@ helpers do
|
|
1110
1110
|
end
|
1111
1111
|
|
1112
1112
|
get '/:nombre' do
|
1113
|
-
bar(params[
|
1113
|
+
bar(params['nombre'])
|
1114
1114
|
end
|
1115
1115
|
```
|
1116
1116
|
|
@@ -1145,7 +1145,7 @@ get '/' do
|
|
1145
1145
|
end
|
1146
1146
|
|
1147
1147
|
get '/:valor' do
|
1148
|
-
session[:valor] = params[
|
1148
|
+
session[:valor] = params['valor']
|
1149
1149
|
end
|
1150
1150
|
```
|
1151
1151
|
|
@@ -1163,7 +1163,7 @@ get '/' do
|
|
1163
1163
|
end
|
1164
1164
|
|
1165
1165
|
get '/:valor' do
|
1166
|
-
session[:valor] = params[
|
1166
|
+
session[:valor] = params['valor']
|
1167
1167
|
end
|
1168
1168
|
```
|
1169
1169
|
|
@@ -1230,7 +1230,7 @@ la petición usando `pass`:
|
|
1230
1230
|
|
1231
1231
|
``` ruby
|
1232
1232
|
get '/adivina/:quien' do
|
1233
|
-
pass unless params[
|
1233
|
+
pass unless params['quien'] == 'Franco'
|
1234
1234
|
'Adivinaste!'
|
1235
1235
|
end
|
1236
1236
|
|
@@ -1263,7 +1263,7 @@ helper, y llamarlo desde `/foo` y `/bar`. Así, vas a simplificar
|
|
1263
1263
|
las pruebas y a mejorar el rendimiento.
|
1264
1264
|
|
1265
1265
|
Si querés que la petición se envíe a la misma instancia de la aplicación en
|
1266
|
-
lugar de
|
1266
|
+
lugar de otra, usá `call!` en lugar de `call`.
|
1267
1267
|
|
1268
1268
|
En la especificación de Rack podés encontrar más información sobre
|
1269
1269
|
`call`.
|
@@ -1309,7 +1309,7 @@ para obtener sus valores cuando no se les pasa argumentos.
|
|
1309
1309
|
A veces vas a querer empezar a enviar la respuesta a pesar de que todavía no
|
1310
1310
|
terminaste de generar su cuerpo. También es posible que, en algunos casos,
|
1311
1311
|
quieras seguir enviando información hasta que el cliente cierre la conexión.
|
1312
|
-
Cuando esto ocurra, el `stream`
|
1312
|
+
Cuando esto ocurra, el helper `stream` te va a ser de gran ayuda:
|
1313
1313
|
|
1314
1314
|
``` ruby
|
1315
1315
|
get '/' do
|
@@ -1331,7 +1331,7 @@ depende de un recurso lento.
|
|
1331
1331
|
|
1332
1332
|
Hay que tener en cuenta que el comportamiento del streaming, especialmente el
|
1333
1333
|
número de peticiones concurrentes, depende del servidor web utilizado para
|
1334
|
-
|
1334
|
+
alojar la aplicación. Puede que algunos servidores, como es el caso de
|
1335
1335
|
WEBRick, no soporten streaming directamente, así el cuerpo de la respuesta será
|
1336
1336
|
enviado completamente de una vez cuando el bloque pasado a `stream` finalice su
|
1337
1337
|
ejecución. Si estás usando Shotgun, el streaming no va a funcionar.
|
@@ -1353,7 +1353,7 @@ end
|
|
1353
1353
|
|
1354
1354
|
post '/' do
|
1355
1355
|
# escribimos a todos los streams abiertos
|
1356
|
-
conexiones.each { |salida| salida << params[
|
1356
|
+
conexiones.each { |salida| salida << params['mensaje'] << "\n" }
|
1357
1357
|
"mensaje enviado"
|
1358
1358
|
end
|
1359
1359
|
```
|
@@ -1512,13 +1512,13 @@ end
|
|
1512
1512
|
```
|
1513
1513
|
|
1514
1514
|
Para usar cachés adecuadamente, deberías considerar usar `etag` o
|
1515
|
-
`last_modified`. Es recomendable que llames a estos
|
1515
|
+
`last_modified`. Es recomendable que llames a estos asistentes *antes* de hacer
|
1516
1516
|
cualquier trabajo pesado, ya que van a enviar la respuesta inmediatamente si
|
1517
1517
|
el cliente ya tiene la versión actual en su caché:
|
1518
1518
|
|
1519
1519
|
``` ruby
|
1520
1520
|
get '/articulo/:id' do
|
1521
|
-
@articulo = Articulo.find params[
|
1521
|
+
@articulo = Articulo.find params['id']
|
1522
1522
|
last_modified @articulo.updated_at
|
1523
1523
|
etag @articulo.sha1
|
1524
1524
|
erb :articulo
|
@@ -1557,8 +1557,8 @@ para más detalles).
|
|
1557
1557
|
De acuerdo con la RFC 2616 tu aplicación debería comportarse diferente si a las
|
1558
1558
|
cabeceras If-Match o If-None-Match se le asigna el valor `*` cuando el
|
1559
1559
|
recurso solicitado ya existe. Sinatra asume para peticiones seguras (como get)
|
1560
|
-
|
1561
|
-
(como post) asume que no.
|
1560
|
+
y potentes (como put) que el recurso existe, mientras que para el resto
|
1561
|
+
(como post) asume que no. Podés cambiar este comportamiento con la opción
|
1562
1562
|
`:new_resource`:
|
1563
1563
|
|
1564
1564
|
``` ruby
|
@@ -1616,7 +1616,7 @@ Estas opciones son:
|
|
1616
1616
|
página de error.
|
1617
1617
|
|
1618
1618
|
Si el Rack handler lo soporta, se intentará no transmitir directamente desde el
|
1619
|
-
proceso de Ruby. Si usás este método, Sinatra se va a encargar automáticamente
|
1619
|
+
proceso de Ruby. Si usás este método, Sinatra se va a encargar automáticamente de las
|
1620
1620
|
peticiones de rango.
|
1621
1621
|
|
1622
1622
|
### Accediendo al objeto de la petición
|
@@ -1647,7 +1647,7 @@ get '/foo' do
|
|
1647
1647
|
request["UNA_CABECERA"] # valor de la cabecera UNA_CABECERA
|
1648
1648
|
request.referrer # la referencia del cliente o '/'
|
1649
1649
|
request.user_agent # user agent (usado por la condición :agent)
|
1650
|
-
request.cookies # hash de las cookies del
|
1650
|
+
request.cookies # hash de las cookies del navegador
|
1651
1651
|
request.xhr? # es una petición ajax?
|
1652
1652
|
request.url # "http://ejemplo.com/ejemplo/foo"
|
1653
1653
|
request.path # "/ejemplo/foo"
|
@@ -1681,7 +1681,7 @@ end
|
|
1681
1681
|
|
1682
1682
|
### Archivos Adjuntos
|
1683
1683
|
|
1684
|
-
Podés usar el
|
1684
|
+
Podés usar el helper `attachment` para indicarle al navegador que
|
1685
1685
|
almacene la respuesta en el disco en lugar de mostrarla en pantalla:
|
1686
1686
|
|
1687
1687
|
``` ruby
|
@@ -1783,7 +1783,7 @@ que llama al bloque que recibe para cada path posible. Esto no representa un
|
|
1783
1783
|
problema de rendimiento debido a que `render` va a usar `break` ni bien
|
1784
1784
|
encuentre un archivo que exista. Además, las ubicaciones de las plantillas (y
|
1785
1785
|
su contenido) se cachean cuando no estás en el modo de desarrollo. Es bueno
|
1786
|
-
tener en cuenta lo
|
1786
|
+
tener en cuenta lo anterior si escribís un método extraño.
|
1787
1787
|
|
1788
1788
|
## Configuración
|
1789
1789
|
|
@@ -1844,7 +1844,7 @@ end
|
|
1844
1844
|
Sinatra usa [Rack::Protection](https://github.com/rkh/rack-protection#readme)
|
1845
1845
|
para defender a tu aplicación de los ataques más comunes. Si por algún motivo,
|
1846
1846
|
querés desactivar esta funcionalidad, podés hacerlo como se indica a
|
1847
|
-
continuación (
|
1847
|
+
continuación (ten en cuenta que tu aplicación va a quedar expuesta a un
|
1848
1848
|
montón de vulnerabilidades bien conocidas):
|
1849
1849
|
|
1850
1850
|
``` ruby
|
@@ -1881,14 +1881,14 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1881
1881
|
Deshabilitada por defecto.
|
1882
1882
|
</dd>
|
1883
1883
|
|
1884
|
-
<dt>
|
1884
|
+
<dt>add_charset</dt>
|
1885
1885
|
<dd>
|
1886
1886
|
Tipos mime a los que el helper <tt>content_type</tt> les
|
1887
1887
|
añade automáticamente el charset.
|
1888
1888
|
|
1889
1889
|
En general, no deberías asignar directamente esta opción,
|
1890
1890
|
sino añadirle los charsets que quieras:
|
1891
|
-
<tt>settings.
|
1891
|
+
<tt>settings.add_charset << "application/foobar"</tt>
|
1892
1892
|
</dd>
|
1893
1893
|
|
1894
1894
|
<dt>app_file</dt>
|
@@ -1974,7 +1974,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1974
1974
|
|
1975
1975
|
<dt>public_folder</dt>
|
1976
1976
|
<dd>
|
1977
|
-
|
1977
|
+
Lugar del directorio desde donde se sirven los archivos
|
1978
1978
|
públicos. Solo se utiliza cuando se sirven archivos
|
1979
1979
|
estáticos (ver la opción <tt>static</tt>). Si no
|
1980
1980
|
está presente, se infiere del valor de la opción
|
@@ -1990,7 +1990,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
1990
1990
|
|
1991
1991
|
<dt>root</dt>
|
1992
1992
|
<dd>
|
1993
|
-
|
1993
|
+
Lugar del directorio raíz del proyecto. Si no está
|
1994
1994
|
presente, se infiere del valor de la opción
|
1995
1995
|
<tt>app_file</tt>.
|
1996
1996
|
</dd>
|
@@ -2012,7 +2012,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2012
2012
|
|
2013
2013
|
<dt>running</dt>
|
2014
2014
|
<dd>
|
2015
|
-
Indica si el servidor integrado está
|
2015
|
+
Indica si el servidor integrado está ejecutándose, ¡no
|
2016
2016
|
cambiés esta configuración!.
|
2017
2017
|
</dd>
|
2018
2018
|
|
@@ -2053,7 +2053,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2053
2053
|
<dt>static_cache_control</dt>
|
2054
2054
|
<dd>
|
2055
2055
|
Cuando Sinatra está sirviendo archivos estáticos, y
|
2056
|
-
|
2056
|
+
esta opción está habilitada, les va a agregar encabezados
|
2057
2057
|
<tt>Cache-Control</tt> a las respuestas. Para esto
|
2058
2058
|
utiliza el helper <tt>cache_control</tt>. Se encuentra
|
2059
2059
|
deshabilitada por defecto. Notar que es necesario
|
@@ -2115,7 +2115,7 @@ obtener de la variable Rack `sinatra.error`:
|
|
2115
2115
|
|
2116
2116
|
``` ruby
|
2117
2117
|
error do
|
2118
|
-
'Disculpá, ocurrió un error horrible - ' + env['sinatra.error'].
|
2118
|
+
'Disculpá, ocurrió un error horrible - ' + env['sinatra.error'].message
|
2119
2119
|
end
|
2120
2120
|
```
|
2121
2121
|
|
@@ -2164,7 +2164,7 @@ cuando se ejecuta dentro del entorno de desarrollo "development".
|
|
2164
2164
|
|
2165
2165
|
## Rack Middleware
|
2166
2166
|
|
2167
|
-
Sinatra corre sobre Rack
|
2167
|
+
Sinatra corre sobre [Rack](http://rack.github.io/), una interfaz minimalista
|
2168
2168
|
que es un estándar para frameworks webs escritos en Ruby. Una de las
|
2169
2169
|
características más interesantes de Rack para los desarrolladores de aplicaciones
|
2170
2170
|
es el soporte de "middleware" -- componentes que se ubican entre el servidor y
|
@@ -2187,7 +2187,7 @@ end
|
|
2187
2187
|
```
|
2188
2188
|
|
2189
2189
|
La semántica de `use` es idéntica a la definida para el DSL
|
2190
|
-
Rack::Builder[http://
|
2190
|
+
Rack::Builder[http://rubydoc.info/github/rack/rack/master/Rack/Builder] (más
|
2191
2191
|
frecuentemente usado en archivos rackup). Por ejemplo, el método `use`
|
2192
2192
|
acepta argumentos múltiples/variables así como bloques:
|
2193
2193
|
|
@@ -2198,9 +2198,9 @@ end
|
|
2198
2198
|
```
|
2199
2199
|
|
2200
2200
|
Rack es distribuido con una variedad de middleware estándar para logging,
|
2201
|
-
debugging, enrutamiento URL, autenticación
|
2201
|
+
debugging, enrutamiento URL, autenticación y manejo de sesiones. Sinatra
|
2202
2202
|
usa muchos de estos componentes automáticamente de acuerdo a su configuración
|
2203
|
-
para que
|
2203
|
+
para que usualmente no tengas que usarlas (con `use`) explícitamente.
|
2204
2204
|
|
2205
2205
|
Podés encontrar middleware útil en
|
2206
2206
|
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
@@ -2215,10 +2215,10 @@ cualquier framework o librería de pruebas basada en Rack. Se recomienda usar
|
|
2215
2215
|
|
2216
2216
|
``` ruby
|
2217
2217
|
require 'mi_app_sinatra'
|
2218
|
-
require '
|
2218
|
+
require 'minitest/autorun'
|
2219
2219
|
require 'rack/test'
|
2220
2220
|
|
2221
|
-
class MiAppTest < Test
|
2221
|
+
class MiAppTest < Minitest::Test
|
2222
2222
|
include Rack::Test::Methods
|
2223
2223
|
|
2224
2224
|
def app
|
@@ -2244,10 +2244,10 @@ end
|
|
2244
2244
|
|
2245
2245
|
## Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares
|
2246
2246
|
|
2247
|
-
Definir tu aplicación en el
|
2247
|
+
Definir tu aplicación en el nivel superior funciona bien para micro-aplicaciones
|
2248
2248
|
pero trae inconvenientes considerables a la hora de construir componentes
|
2249
2249
|
reutilizables como Rack middleware, Rails metal, librerías simples con un
|
2250
|
-
componente de servidor
|
2250
|
+
componente de servidor o incluso extensiones de Sinatra. El DSL de alto nivel
|
2251
2251
|
asume una configuración apropiada para micro-aplicaciones (por ejemplo, un
|
2252
2252
|
único archivo de aplicación, los directorios `./public` y
|
2253
2253
|
`./views`, logging, página con detalles de excepción, etc.). Ahí es
|
@@ -2287,13 +2287,13 @@ para detalles sobre las opciones disponibles y su comportamiento.
|
|
2287
2287
|
Contrariamente a la creencia popular, no hay nada de malo con el estilo clásico.
|
2288
2288
|
Si se ajusta a tu aplicación, no es necesario que la cambies a una modular.
|
2289
2289
|
|
2290
|
-
|
2290
|
+
La desventaja de usar el estilo clásico en lugar del modular consiste en que
|
2291
2291
|
solamente podés tener una aplicación Sinatra por proceso Ruby. Si tenés
|
2292
|
-
planificado usar más, cambiá al estilo modular. Al mismo tiempo,
|
2292
|
+
planificado usar más, cambiá al estilo modular. Al mismo tiempo, ten en
|
2293
2293
|
cuenta que no hay ninguna razón por la cuál no puedas mezclar los estilos
|
2294
2294
|
clásico y modular.
|
2295
2295
|
|
2296
|
-
A continuación se detallan las diferencias (
|
2296
|
+
A continuación se detallan las diferencias (sútiles) entre las configuraciones
|
2297
2297
|
de ambos estilos:
|
2298
2298
|
|
2299
2299
|
<table>
|
@@ -2397,11 +2397,11 @@ require './app'
|
|
2397
2397
|
run Sinatra::Application
|
2398
2398
|
```
|
2399
2399
|
|
2400
|
-
### ¿Cuándo
|
2400
|
+
### ¿Cuándo usar config.ru?
|
2401
2401
|
|
2402
2402
|
Indicadores de que probablemente querés usar `config.ru`:
|
2403
2403
|
|
2404
|
-
* Querés realizar el deploy con un
|
2404
|
+
* Querés realizar el deploy con un handler Rack distinto (Passenger, Unicorn,
|
2405
2405
|
Heroku, ...).
|
2406
2406
|
* Querés usar más de una subclase de `Sinatra::Base`.
|
2407
2407
|
* Querés usar Sinatra únicamente para middleware, pero no como un endpoint.
|
@@ -2426,8 +2426,8 @@ class PantallaDeLogin < Sinatra::Base
|
|
2426
2426
|
get('/login') { haml :login }
|
2427
2427
|
|
2428
2428
|
post('/login') do
|
2429
|
-
if params[
|
2430
|
-
session['nombre_de_usuario'] = params[
|
2429
|
+
if params['nombre'] == 'admin' && params['password'] == 'admin'
|
2430
|
+
session['nombre_de_usuario'] = params['nombre']
|
2431
2431
|
else
|
2432
2432
|
redirect '/login'
|
2433
2433
|
end
|
@@ -2552,8 +2552,8 @@ class MiApp < Sinatra::Base
|
|
2552
2552
|
# Ámbito de petición para '/definir_ruta/:nombre'
|
2553
2553
|
@valor = 42
|
2554
2554
|
|
2555
|
-
settings.get("/#{params[
|
2556
|
-
# Ámbito de petición para "/#{params[
|
2555
|
+
settings.get("/#{params['nombre']}") do
|
2556
|
+
# Ámbito de petición para "/#{params['nombre']}"
|
2557
2557
|
@valor # => nil (no es la misma petición)
|
2558
2558
|
end
|
2559
2559
|
|
@@ -2620,7 +2620,7 @@ Las siguientes versiones de Ruby son soportadas oficialmente:
|
|
2620
2620
|
embargo, que eso ocurra es muy poco probable, e incluso el caso de que lo
|
2621
2621
|
haga, puede que se siga dando soporte a 1.8.7. <b>Hemos dejado de soportar
|
2622
2622
|
Ruby 1.8.6.</b> Si querés ejecutar Sinatra sobre 1.8.6, podés utilizar la
|
2623
|
-
versión 1.2, pero
|
2623
|
+
versión 1.2, pero ten en cuenta que una vez que Sinatra 1.4.0 sea liberado,
|
2624
2624
|
ya no se corregirán errores por más que se reciban reportes de los mismos.
|
2625
2625
|
</dd>
|
2626
2626
|
|
@@ -2629,12 +2629,12 @@ Las siguientes versiones de Ruby son soportadas oficialmente:
|
|
2629
2629
|
1.9.2 es soportado y recomendado. No uses 1.9.2p0, porque se producen fallos
|
2630
2630
|
de segmentación cuando se ejecuta Sinatra. El soporte se mantendrá al menos
|
2631
2631
|
hasta que se libere la versión 1.9.4/2.0 de Ruby. El soporte para la última
|
2632
|
-
versión de la serie 1.9 se mantendrá mientras lo haga el
|
2632
|
+
versión de la serie 1.9 se mantendrá mientras lo haga el equipo principal de Ruby.
|
2633
2633
|
</dd>
|
2634
2634
|
|
2635
2635
|
<dt>Ruby 1.9.3</dt>
|
2636
2636
|
<dd>
|
2637
|
-
1.9.3 es soportado y recomendado.
|
2637
|
+
1.9.3 es soportado y recomendado. Ten en cuenta que el cambio a 1.9.3 desde
|
2638
2638
|
una versión anterior va a invalidar todas las sesiones.
|
2639
2639
|
</dd>
|
2640
2640
|
|
@@ -2651,7 +2651,7 @@ Las siguientes versiones de Ruby son soportadas oficialmente:
|
|
2651
2651
|
con librerías de plantillas de terceras partes. Sin embargo, si elegís usar
|
2652
2652
|
JRuby, deberías examinar sus Rack handlers porque el servidor web Thin no es
|
2653
2653
|
soportado completamente. El soporte de JRuby para extensiones C se encuentra
|
2654
|
-
en una etapa experimental, sin embargo, de momento solamente RDiscount,
|
2654
|
+
en una etapa experimental, sin embargo, de momento, solamente RDiscount,
|
2655
2655
|
Redcarpet, RedCloth y Yajl, así como Thin y Mongrel se ven afectadas.
|
2656
2656
|
</dd>
|
2657
2657
|
</dl>
|
@@ -2666,7 +2666,7 @@ oficialmente. De cualquier manera, pueden ejecutar Sinatra:
|
|
2666
2666
|
* MacRuby, Maglev e IronRuby
|
2667
2667
|
* Ruby 1.9.0 y 1.9.1 (pero no te recomendamos que los uses)
|
2668
2668
|
|
2669
|
-
No
|
2669
|
+
No ser soportada oficialmente, significa que si las cosas se rompen
|
2670
2670
|
ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino
|
2671
2671
|
el suyo.
|
2672
2672
|
|
@@ -2699,7 +2699,7 @@ Para obtener algunas de las últimas características.
|
|
2699
2699
|
Esta es la manera recomendada para ejecutar tu aplicación sobre la última
|
2700
2700
|
versión de Sinatra usando [Bundler](http://gembundler.com/).
|
2701
2701
|
|
2702
|
-
Primero, instalá
|
2702
|
+
Primero, instalá Bundler si no lo hiciste todavía:
|
2703
2703
|
|
2704
2704
|
``` shell
|
2705
2705
|
gem install bundler
|
@@ -2776,7 +2776,7 @@ siguiendo las especificaciones SemVer y SemVerTag.
|
|
2776
2776
|
* [Twitter](http://twitter.com/sinatra)
|
2777
2777
|
* [Lista de Correo](http://groups.google.com/group/sinatrarb/topics)
|
2778
2778
|
* [IRC: #sinatra](irc://chat.freenode.net/#sinatra) en http://freenode.net
|
2779
|
-
* [Sinatra Book](
|
2779
|
+
* [Sinatra Book](https://github.com/sinatra/sinatra-book/) Tutorial (en inglés).
|
2780
2780
|
* [Sinatra Recipes](http://recipes.sinatrarb.com/) Recetas contribuidas
|
2781
2781
|
por la comunidad (en inglés).
|
2782
2782
|
* Documentación de la API para la
|