sinatra 2.1.0 → 2.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +82 -0
- data/Gemfile +4 -5
- data/MAINTENANCE.md +2 -15
- data/README.de.md +13 -13
- data/README.es.md +59 -30
- data/README.ja.md +61 -31
- data/README.md +27 -27
- data/README.pt-br.md +60 -60
- data/VERSION +1 -1
- data/lib/sinatra/base.rb +59 -46
- data/lib/sinatra/indifferent_hash.rb +14 -0
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +3 -9
- metadata +11 -22
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Sinatra
|
2
2
|
|
3
|
-
[![Gem Version](https://badge.fury.io/rb/sinatra.svg)](
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/sinatra.svg)](https://badge.fury.io/rb/sinatra)
|
4
4
|
[![Build Status](https://secure.travis-ci.org/sinatra/sinatra.svg)](https://travis-ci.org/sinatra/sinatra)
|
5
5
|
[![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=sinatra&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=sinatra&package-manager=bundler&version-scheme=semver)
|
6
6
|
|
@@ -344,11 +344,11 @@ end
|
|
344
344
|
## Return Values
|
345
345
|
|
346
346
|
The return value of a route block determines at least the response body
|
347
|
-
passed on to the HTTP client
|
347
|
+
passed on to the HTTP client or at least the next middleware in the
|
348
348
|
Rack stack. Most commonly, this is a string, as in the above examples.
|
349
349
|
But other values are also accepted.
|
350
350
|
|
351
|
-
You can return
|
351
|
+
You can return an object that would either be a valid Rack response, Rack
|
352
352
|
body object or HTTP status code:
|
353
353
|
|
354
354
|
* An Array with three elements: `[status (Integer), headers (Hash), response
|
@@ -372,7 +372,7 @@ get('/') { Stream.new }
|
|
372
372
|
```
|
373
373
|
|
374
374
|
You can also use the `stream` helper method ([described below](#streaming-responses)) to reduce
|
375
|
-
|
375
|
+
boilerplate and embed the streaming logic in the route.
|
376
376
|
|
377
377
|
## Custom Route Matchers
|
378
378
|
|
@@ -1201,7 +1201,7 @@ end
|
|
1201
1201
|
```
|
1202
1202
|
|
1203
1203
|
Currently, the following rendering methods accept a block: `erb`, `haml`,
|
1204
|
-
`liquid`, `slim `, `wlang`. Also the general `render` method accepts a block.
|
1204
|
+
`liquid`, `slim `, `wlang`. Also, the general `render` method accepts a block.
|
1205
1205
|
|
1206
1206
|
### Inline Templates
|
1207
1207
|
|
@@ -1224,7 +1224,7 @@ __END__
|
|
1224
1224
|
%div.title Hello world.
|
1225
1225
|
```
|
1226
1226
|
|
1227
|
-
NOTE: Inline templates defined in the source file that requires
|
1227
|
+
NOTE: Inline templates defined in the source file that requires Sinatra are
|
1228
1228
|
automatically loaded. Call `enable :inline_templates` explicitly if you
|
1229
1229
|
have inline templates in other source files.
|
1230
1230
|
|
@@ -1434,7 +1434,7 @@ For better security and usability it's
|
|
1434
1434
|
secret and store it in an environment variable on each host running your
|
1435
1435
|
application so that all of your application instances will share the same
|
1436
1436
|
secret. You should periodically rotate this session secret to a new value.
|
1437
|
-
Here are some examples of how you might create a 64
|
1437
|
+
Here are some examples of how you might create a 64-byte secret and set it:
|
1438
1438
|
|
1439
1439
|
**Session Secret Generation**
|
1440
1440
|
|
@@ -1446,7 +1446,7 @@ $ ruby -e "require 'securerandom'; puts SecureRandom.hex(64)"
|
|
1446
1446
|
**Session Secret Generation (Bonus Points)**
|
1447
1447
|
|
1448
1448
|
Use the [sysrandom gem](https://github.com/cryptosphere/sysrandom#readme) to
|
1449
|
-
|
1449
|
+
use the system RNG facilities to generate random values instead of
|
1450
1450
|
userspace `OpenSSL` which MRI Ruby currently defaults to:
|
1451
1451
|
|
1452
1452
|
```text
|
@@ -1472,7 +1472,7 @@ purposes only:
|
|
1472
1472
|
|
1473
1473
|
**Session Secret App Config**
|
1474
1474
|
|
1475
|
-
|
1475
|
+
Set up your app config to fail-safe to a secure random secret
|
1476
1476
|
if the `SESSION_SECRET` environment variable is not available.
|
1477
1477
|
|
1478
1478
|
For bonus points use the [sysrandom
|
@@ -1593,7 +1593,7 @@ matching route. If no matching route is found, a 404 is returned.
|
|
1593
1593
|
|
1594
1594
|
### Triggering Another Route
|
1595
1595
|
|
1596
|
-
Sometimes `pass` is not what you want, instead you would like to get the
|
1596
|
+
Sometimes `pass` is not what you want, instead, you would like to get the
|
1597
1597
|
result of calling another route. Simply use `call` to achieve this:
|
1598
1598
|
|
1599
1599
|
```ruby
|
@@ -1616,13 +1616,13 @@ than a duplicate, use `call!` instead of `call`.
|
|
1616
1616
|
|
1617
1617
|
Check out the Rack specification if you want to learn more about `call`.
|
1618
1618
|
|
1619
|
-
### Setting Body, Status Code and Headers
|
1619
|
+
### Setting Body, Status Code, and Headers
|
1620
1620
|
|
1621
1621
|
It is possible and recommended to set the status code and response body with
|
1622
|
-
the return value of the route block. However, in some scenarios you might
|
1622
|
+
the return value of the route block. However, in some scenarios, you might
|
1623
1623
|
want to set the body at an arbitrary point in the execution flow. You can do
|
1624
1624
|
so with the `body` helper method. If you do so, you can use that method from
|
1625
|
-
|
1625
|
+
thereon to access the body:
|
1626
1626
|
|
1627
1627
|
```ruby
|
1628
1628
|
get '/foo' do
|
@@ -1645,7 +1645,7 @@ get '/foo' do
|
|
1645
1645
|
headers \
|
1646
1646
|
"Allow" => "BREW, POST, GET, PROPFIND, WHEN",
|
1647
1647
|
"Refresh" => "Refresh: 20; https://ietf.org/rfc/rfc2324.txt"
|
1648
|
-
body "I'm a
|
1648
|
+
body "I'm a teapot!"
|
1649
1649
|
end
|
1650
1650
|
```
|
1651
1651
|
|
@@ -1678,7 +1678,7 @@ also be used to increase throughput if some but not all content depends on a
|
|
1678
1678
|
slow resource.
|
1679
1679
|
|
1680
1680
|
Note that the streaming behavior, especially the number of concurrent
|
1681
|
-
requests, highly depends on the
|
1681
|
+
requests, highly depends on the webserver used to serve the application.
|
1682
1682
|
Some servers might not even support streaming at all. If the server does not
|
1683
1683
|
support streaming, the body will be sent all at once after the block passed
|
1684
1684
|
to `stream` finishes executing. Streaming does not work at all with Shotgun.
|
@@ -1763,7 +1763,7 @@ class MyApp < Sinatra::Base
|
|
1763
1763
|
end
|
1764
1764
|
```
|
1765
1765
|
|
1766
|
-
To avoid any logging middleware to be set up, set the `logging`
|
1766
|
+
To avoid any logging middleware to be set up, set the `logging` option to
|
1767
1767
|
`nil`. However, keep in mind that `logger` will in that case return `nil`. A
|
1768
1768
|
common use case is when you want to set your own logger. Sinatra will use
|
1769
1769
|
whatever it will find in `env['rack.logger']`.
|
@@ -1797,7 +1797,7 @@ Haml:
|
|
1797
1797
|
%a{:href => url('/foo')} foo
|
1798
1798
|
```
|
1799
1799
|
|
1800
|
-
It takes reverse proxies and Rack routers into account
|
1800
|
+
It takes reverse proxies and Rack routers into account - if present.
|
1801
1801
|
|
1802
1802
|
This method is also aliased to `to` (see [below](#browser-redirect) for an example).
|
1803
1803
|
|
@@ -2147,7 +2147,7 @@ helpers do
|
|
2147
2147
|
end
|
2148
2148
|
```
|
2149
2149
|
|
2150
|
-
You can also easily wrap this up in an extension and share with others!
|
2150
|
+
You can also easily wrap this up in an extension and share it with others!
|
2151
2151
|
|
2152
2152
|
Note that `find_template` does not check if the file really exists but
|
2153
2153
|
rather calls the given block for all possible paths. This is not a
|
@@ -2236,7 +2236,7 @@ set :protection, :except => [:path_traversal, :session_hijacking]
|
|
2236
2236
|
By default, Sinatra will only set up session based protection if `:sessions`
|
2237
2237
|
have been enabled. See '[Using Sessions](#using-sessions)'. Sometimes you may want to set up
|
2238
2238
|
sessions "outside" of the Sinatra app, such as in the config.ru or with a
|
2239
|
-
separate `Rack::Builder` instance. In that case you can still set up session
|
2239
|
+
separate `Rack::Builder` instance. In that case, you can still set up session
|
2240
2240
|
based protection by passing the `:session` option:
|
2241
2241
|
|
2242
2242
|
```ruby
|
@@ -2293,7 +2293,7 @@ set :protection, :session => true
|
|
2293
2293
|
<dd>Encoding to assume if unknown (defaults to <tt>"utf-8"</tt>).</dd>
|
2294
2294
|
|
2295
2295
|
<dt>dump_errors</dt>
|
2296
|
-
<dd>Display errors in the log.</dd>
|
2296
|
+
<dd>Display errors in the log. Enabled by default unless environment is "test".</dd>
|
2297
2297
|
|
2298
2298
|
<dt>environment</dt>
|
2299
2299
|
<dd>
|
@@ -2717,7 +2717,7 @@ modular application.
|
|
2717
2717
|
The main disadvantage of using the classic style rather than the modular
|
2718
2718
|
style is that you will only have one Sinatra application per Ruby
|
2719
2719
|
process. If you plan to use more than one, switch to the modular style.
|
2720
|
-
There is no reason you cannot mix the modular and
|
2720
|
+
There is no reason you cannot mix the modular and classic styles.
|
2721
2721
|
|
2722
2722
|
If switching from one style to the other, you should be aware of
|
2723
2723
|
slightly different default settings:
|
@@ -2846,7 +2846,7 @@ style for running with a `config.ru`.**
|
|
2846
2846
|
### Using Sinatra as Middleware
|
2847
2847
|
|
2848
2848
|
Not only is Sinatra able to use other Rack middleware, any Sinatra
|
2849
|
-
application can in turn be added in front of any Rack endpoint as
|
2849
|
+
application can, in turn, be added in front of any Rack endpoint as
|
2850
2850
|
middleware itself. This endpoint could be another Sinatra application,
|
2851
2851
|
or any other Rack-based application (Rails/Hanami/Roda/...):
|
2852
2852
|
|
@@ -2937,7 +2937,7 @@ available.
|
|
2937
2937
|
Every Sinatra application corresponds to a subclass of `Sinatra::Base`.
|
2938
2938
|
If you are using the top-level DSL (`require 'sinatra'`), then this
|
2939
2939
|
class is `Sinatra::Application`, otherwise it is the subclass you
|
2940
|
-
created explicitly. At class level you have methods like `get` or
|
2940
|
+
created explicitly. At the class level, you have methods like `get` or
|
2941
2941
|
`before`, but you cannot access the `request` or `session` objects, as
|
2942
2942
|
there is only a single application class for all requests.
|
2943
2943
|
|
@@ -2960,7 +2960,7 @@ You have the application scope binding inside:
|
|
2960
2960
|
* Your application class body
|
2961
2961
|
* Methods defined by extensions
|
2962
2962
|
* The block passed to `helpers`
|
2963
|
-
* Procs/blocks used as value for `set`
|
2963
|
+
* Procs/blocks used as a value for `set`
|
2964
2964
|
* The block passed to `Sinatra.new`
|
2965
2965
|
|
2966
2966
|
You can reach the scope object (the class) like this:
|
@@ -3011,7 +3011,7 @@ do not share variables/state with the class scope (read: you have a different
|
|
3011
3011
|
|
3012
3012
|
You have the delegate scope binding inside:
|
3013
3013
|
|
3014
|
-
* The top
|
3014
|
+
* The top-level binding, if you did `require "sinatra"`
|
3015
3015
|
* An object extended with the `Sinatra::Delegator` mixin
|
3016
3016
|
|
3017
3017
|
Have a look at the code for yourself: here's the
|
@@ -3044,7 +3044,7 @@ _Paraphrasing from
|
|
3044
3044
|
[this StackOverflow answer](https://stackoverflow.com/a/6282999/5245129)
|
3045
3045
|
by Konstantin_
|
3046
3046
|
|
3047
|
-
Sinatra doesn't impose any concurrency model
|
3047
|
+
Sinatra doesn't impose any concurrency model but leaves that to the
|
3048
3048
|
underlying Rack handler (server) like Puma or WEBrick. Sinatra
|
3049
3049
|
itself is thread-safe, so there won't be any problem if the Rack handler
|
3050
3050
|
uses a threaded model of concurrency. This would mean that when starting
|
@@ -3105,7 +3105,7 @@ The following Ruby versions are officially supported:
|
|
3105
3105
|
</dd>
|
3106
3106
|
</dl>
|
3107
3107
|
|
3108
|
-
Versions of Ruby
|
3108
|
+
Versions of Ruby before 2.3 are no longer supported as of Sinatra 2.1.0.
|
3109
3109
|
|
3110
3110
|
We also keep an eye on upcoming Ruby versions.
|
3111
3111
|
|
data/README.pt-br.md
CHANGED
@@ -263,7 +263,7 @@ get '/posts' do
|
|
263
263
|
# corresponde a "GET /posts?titulo=foo&autor=bar"
|
264
264
|
titulo = params['titulo']
|
265
265
|
autor = params['autor']
|
266
|
-
# utiliza as
|
266
|
+
# utiliza as variáveis titulo e autor; a query é opcional para a rota /posts
|
267
267
|
end
|
268
268
|
```
|
269
269
|
|
@@ -362,10 +362,10 @@ Você pode retornar uma resposta válida ou um objeto para o Rack, sendo
|
|
362
362
|
eles de qualquer tipo de objeto que queira. Além disso, é possível
|
363
363
|
retornar um código de status HTTP.
|
364
364
|
|
365
|
-
* Um array com três
|
365
|
+
* Um array com três elementos: `[status (Integer), cabeçalho (Hash),
|
366
366
|
corpo da resposta (responde à #each)]`
|
367
367
|
|
368
|
-
* Um array com dois
|
368
|
+
* Um array com dois elementos: `[status (Integer), corpo da resposta
|
369
369
|
(responde à #each)]`
|
370
370
|
|
371
371
|
* Um objeto que responda à `#each` sem passar nada, mas, sim, `strings`
|
@@ -447,7 +447,7 @@ Arquivos estáticos são disponibilizados a partir do diretório
|
|
447
447
|
set :public_folder, __dir__ + '/estatico'
|
448
448
|
```
|
449
449
|
|
450
|
-
Note que o nome do diretório público não é
|
450
|
+
Note que o nome do diretório público não é incluído na URL. Um arquivo
|
451
451
|
`./public/css/style.css` é disponibilizado como
|
452
452
|
`http://exemplo.com/css/style.css`.
|
453
453
|
|
@@ -541,7 +541,7 @@ Opções disponíveis:
|
|
541
541
|
|
542
542
|
<dt>content_type</dt>
|
543
543
|
<dd>
|
544
|
-
O *Content-Type* que o template produz. O padrão
|
544
|
+
O *Content-Type* que o template produz. O padrão depende
|
545
545
|
da linguagem de template utilizada.
|
546
546
|
</dd>
|
547
547
|
|
@@ -604,9 +604,9 @@ end
|
|
604
604
|
|
605
605
|
### Linguagens de template disponíveis
|
606
606
|
|
607
|
-
Algumas linguagens possuem
|
607
|
+
Algumas linguagens possuem múltiplas implementações. Para especificar qual
|
608
608
|
implementação deverá ser utilizada (e para ser *thread-safe*), você deve
|
609
|
-
|
609
|
+
requerê-la primeiro:
|
610
610
|
|
611
611
|
```ruby
|
612
612
|
require 'rdiscount' # ou require 'bluecloth'
|
@@ -654,7 +654,7 @@ get('/') { markdown :index }
|
|
654
654
|
|
655
655
|
<table>
|
656
656
|
<tr>
|
657
|
-
<td>
|
657
|
+
<td>Dependência</td>
|
658
658
|
<td>
|
659
659
|
<a href="https://github.com/jimweirich/builder" title="builder">
|
660
660
|
builder
|
@@ -806,7 +806,7 @@ mesmo. Portanto normalmente é utilizado junto a outra engine de renderização:
|
|
806
806
|
erb :overview, :locals => { :text => markdown(:introducao) }
|
807
807
|
```
|
808
808
|
|
809
|
-
Note que
|
809
|
+
Note que você também pode chamar o método `markdown` dentro de outros templates:
|
810
810
|
|
811
811
|
```ruby
|
812
812
|
%h1 Olá do Haml!
|
@@ -840,7 +840,7 @@ mesmo. Portanto normalmente é utilizado junto a outra engine de renderização:
|
|
840
840
|
erb :overview, :locals => { :text => textile(:introducao) }
|
841
841
|
```
|
842
842
|
|
843
|
-
Note que
|
843
|
+
Note que você também pode chamar o método `textile` dentro de outros templates:
|
844
844
|
|
845
845
|
```ruby
|
846
846
|
%h1 Olá do Haml!
|
@@ -876,7 +876,7 @@ mesmo. Portanto normalmente é utilizado junto a outra engine de renderização:
|
|
876
876
|
erb :overview, :locals => { :text => rdoc(:introducao) }
|
877
877
|
```
|
878
878
|
|
879
|
-
Note que
|
879
|
+
Note que você também pode chamar o método `rdoc` dentro de outros templates:
|
880
880
|
|
881
881
|
```ruby
|
882
882
|
%h1 Olá do Haml!
|
@@ -1108,7 +1108,7 @@ deve-se passar a `:layout_engine` como opção.
|
|
1108
1108
|
</tr>
|
1109
1109
|
</table>
|
1110
1110
|
|
1111
|
-
Antes que
|
1111
|
+
Antes que você possa utilizar o template Stylus primeiro você deve carregar
|
1112
1112
|
`stylus` e `stylus/tilt`:
|
1113
1113
|
|
1114
1114
|
```ruby
|
@@ -1381,7 +1381,7 @@ after do
|
|
1381
1381
|
end
|
1382
1382
|
```
|
1383
1383
|
|
1384
|
-
Nota: A não ser que você use o
|
1384
|
+
Nota: A não ser que você use o método `body` ao invés de apenas retornar uma
|
1385
1385
|
String das rotas, o corpo ainda não estará disponível no filtro after, uma vez
|
1386
1386
|
que é gerado depois.
|
1387
1387
|
|
@@ -1466,7 +1466,7 @@ Para melhorar a segurança, os dados da sessão no cookie são assinado com uma
|
|
1466
1466
|
segredo de sessão usando `HMAC-SHA1`. Esse segredo de sessão deve ser, de
|
1467
1467
|
preferência, um valor criptograficamente randômico, seguro, de um comprimento
|
1468
1468
|
apropriado no qual `HMAC-SHA1` é maior ou igual a 64 bytes (512 bits, 128
|
1469
|
-
|
1469
|
+
caracteres hexadecimais). Você será avisado para não usar uma chave secreta
|
1470
1470
|
menor que 32 bytes de randomicidade (256 bits, 64 caracteres hexadecimais).
|
1471
1471
|
Portanto, é **muito importante** que você não invente o segredo, mas use um
|
1472
1472
|
gerador de números aleatórios seguro para cria-lo. Humanos são extremamente
|
@@ -1676,8 +1676,8 @@ Veja a especificação do Rack se você quer aprender mais sobre o `call`.
|
|
1676
1676
|
É possível e recomendado definir o código de status e o corpo da resposta com o
|
1677
1677
|
valor retornado do bloco da rota. Entretanto, em alguns cenários você pode
|
1678
1678
|
querer definir o corpo em um ponto arbitrário do fluxo de execução. Você pode
|
1679
|
-
fazer isso com o
|
1680
|
-
|
1679
|
+
fazer isso com o método auxiliar `body`. Se você fizer isso, poderá usar esse
|
1680
|
+
método de agora em diante para acessar o body:
|
1681
1681
|
|
1682
1682
|
```ruby
|
1683
1683
|
get '/foo' do
|
@@ -1689,7 +1689,7 @@ after do
|
|
1689
1689
|
end
|
1690
1690
|
```
|
1691
1691
|
|
1692
|
-
Também é
|
1692
|
+
Também é possível passar um bloco para `body`, que será executado pelo
|
1693
1693
|
manipulador Rack (isso pode ser usado para implementar transmissão,
|
1694
1694
|
[veja "Retorno de Valores"](#retorno-de-valores)).
|
1695
1695
|
|
@@ -1761,21 +1761,21 @@ get '/assinar' do
|
|
1761
1761
|
end
|
1762
1762
|
end
|
1763
1763
|
|
1764
|
-
post '/:
|
1764
|
+
post '/:mensagem' do
|
1765
1765
|
conexoes.each do |saida|
|
1766
1766
|
# notifica o cliente que uma nova mensagem chegou
|
1767
|
-
saida << params['
|
1767
|
+
saida << params['mensagem'] << "\n"
|
1768
1768
|
|
1769
1769
|
# indica ao cliente para se conectar novamente
|
1770
1770
|
saida.close
|
1771
1771
|
end
|
1772
1772
|
|
1773
1773
|
# confirma
|
1774
|
-
"
|
1774
|
+
"mensagem recebida"
|
1775
1775
|
end
|
1776
1776
|
```
|
1777
1777
|
|
1778
|
-
Também é
|
1778
|
+
Também é possível para o cliente fechar a conexão quando está tentando escrever
|
1779
1779
|
para o socket. Devido a isso, é recomendado checar `out.closed?` antes de
|
1780
1780
|
tentar escrever.
|
1781
1781
|
|
@@ -1792,7 +1792,7 @@ end
|
|
1792
1792
|
```
|
1793
1793
|
|
1794
1794
|
Esse logger irá automaticamente botar as configurações de log do manipulador
|
1795
|
-
Rack na sua conta. Se a produção de logs estiver
|
1795
|
+
Rack na sua conta. Se a produção de logs estiver desabilitada, esse método
|
1796
1796
|
retornará um objeto dummy, então você não terá que se preocupar com suas rotas
|
1797
1797
|
e filtros.
|
1798
1798
|
|
@@ -1837,7 +1837,7 @@ end
|
|
1837
1837
|
|
1838
1838
|
### Gerando URLs
|
1839
1839
|
|
1840
|
-
Para gerar URLs você deve usar o
|
1840
|
+
Para gerar URLs você deve usar o método auxiliar `url` no Haml:
|
1841
1841
|
|
1842
1842
|
```ruby
|
1843
1843
|
%a{:href => url('/foo')} foo
|
@@ -1850,7 +1850,7 @@ Esse método é também apelidado para `to` (veja
|
|
1850
1850
|
|
1851
1851
|
### Redirecionamento do Browser
|
1852
1852
|
|
1853
|
-
Você pode lançar um redirecionamento no browser com o
|
1853
|
+
Você pode lançar um redirecionamento no browser com o método auxiliar
|
1854
1854
|
`redirect`:
|
1855
1855
|
|
1856
1856
|
```ruby
|
@@ -1859,7 +1859,7 @@ get '/foo' do
|
|
1859
1859
|
end
|
1860
1860
|
```
|
1861
1861
|
|
1862
|
-
Quaisquer
|
1862
|
+
Quaisquer parâmetros adicionais são interpretados como argumentos passados
|
1863
1863
|
ao `halt`:
|
1864
1864
|
|
1865
1865
|
```ruby
|
@@ -2000,7 +2000,7 @@ etag '', :new_resource => true, :kind => :weak
|
|
2000
2000
|
### Enviando Arquivos
|
2001
2001
|
|
2002
2002
|
Para retornar os conteúdos de um arquivo como as resposta, você pode usar o
|
2003
|
-
|
2003
|
+
método auxiliar `send_file`:
|
2004
2004
|
|
2005
2005
|
```ruby
|
2006
2006
|
get '/' do
|
@@ -2043,14 +2043,14 @@ As opções são:
|
|
2043
2043
|
Código de status a ser enviado. Útil quando está se enviando um arquivo
|
2044
2044
|
estático como uma página de erro. Se suportado pelo handler do Rack,
|
2045
2045
|
outros meios além de transmissão do processo do Ruby serão usados.
|
2046
|
-
So você usar esse
|
2046
|
+
So você usar esse método auxiliar, o Sinatra irá automaticamente lidar com
|
2047
2047
|
requisições de alcance.
|
2048
2048
|
</dd>
|
2049
2049
|
</dl>
|
2050
2050
|
|
2051
|
-
### Acessando o Objeto da
|
2051
|
+
### Acessando o Objeto da Requisição
|
2052
2052
|
|
2053
|
-
O objeto vindo da requisição pode ser acessado do nível de
|
2053
|
+
O objeto vindo da requisição pode ser acessado do nível de requisição (filtros,
|
2054
2054
|
rotas, manipuladores de erro) através do método `request`:
|
2055
2055
|
|
2056
2056
|
```ruby
|
@@ -2070,9 +2070,9 @@ get '/foo' do
|
|
2070
2070
|
request.content_length # tamanho do request.body
|
2071
2071
|
request.media_type # tipo de mídia of request.body
|
2072
2072
|
request.host # "exemplo.com"
|
2073
|
-
request.get? # true (
|
2073
|
+
request.get? # true (método similar para outros tipos de requisição)
|
2074
2074
|
request.form_data? # false
|
2075
|
-
request["algum_ param"] # valor do
|
2075
|
+
request["algum_ param"] # valor do parâmetro 'algum_param'. [] é um atalho para o hash de parâmetros
|
2076
2076
|
request.referrer # a referência do cliente ou '/'
|
2077
2077
|
request.user_agent # agente de usuário (usado por :agent condition)
|
2078
2078
|
request.cookies # hash dos cookies do browser
|
@@ -2095,7 +2095,7 @@ get "/" do
|
|
2095
2095
|
"todas requisições acabam aqui"
|
2096
2096
|
end
|
2097
2097
|
```
|
2098
|
-
`request.body` é uma ES ou um
|
2098
|
+
`request.body` é uma ES ou um objeto StringIO:
|
2099
2099
|
|
2100
2100
|
```ruby
|
2101
2101
|
post "/api" do
|
@@ -2108,7 +2108,7 @@ end
|
|
2108
2108
|
### Anexos
|
2109
2109
|
|
2110
2110
|
Você pode usar o método auxiliar `attachment` para dizer ao navegador que a
|
2111
|
-
|
2111
|
+
resposta deve ser armazenada no disco no lugar de ser exibida no browser:
|
2112
2112
|
|
2113
2113
|
```ruby
|
2114
2114
|
get '/' do
|
@@ -2208,8 +2208,8 @@ realmente maluco.
|
|
2208
2208
|
É possível e recomendado definir o código de status e o corpo da resposta com o
|
2209
2209
|
valor retornado do bloco da rota. Entretanto, em alguns cenários você pode
|
2210
2210
|
querer definir o corpo em um ponto arbitrário do fluxo de execução. Você pode
|
2211
|
-
fazer isso com o
|
2212
|
-
|
2211
|
+
fazer isso com o método auxiliar `body`. Se você fizer isso, poderá usar esse
|
2212
|
+
método de agora em diante para acessar o body:
|
2213
2213
|
|
2214
2214
|
```ruby
|
2215
2215
|
get '/foo' do
|
@@ -2221,7 +2221,7 @@ after do
|
|
2221
2221
|
end
|
2222
2222
|
```
|
2223
2223
|
|
2224
|
-
Também é
|
2224
|
+
Também é possível passar um bloco para `body`, que será executado pelo
|
2225
2225
|
manipulador Rack (isso pode ser usado para implementar transmissão,
|
2226
2226
|
[veja "Retorno de Valores"](#retorno-de-valores)).
|
2227
2227
|
|
@@ -2307,7 +2307,7 @@ post '/:messagem' do
|
|
2307
2307
|
end
|
2308
2308
|
```
|
2309
2309
|
|
2310
|
-
Também é
|
2310
|
+
Também é possível para o cliente fechar a conexão quando está tentando escrever
|
2311
2311
|
para o socket. Devido a isso, é recomendado checar `out.closed?` antes de
|
2312
2312
|
tentar escrever.
|
2313
2313
|
|
@@ -2324,7 +2324,7 @@ end
|
|
2324
2324
|
```
|
2325
2325
|
|
2326
2326
|
Esse logger irá automaticamente botar as configurações de log do manipulador
|
2327
|
-
Rack na sua conta. Se a produção de logs estiver
|
2327
|
+
Rack na sua conta. Se a produção de logs estiver desabilitada, esse método
|
2328
2328
|
retornará um objeto dummy, então você não terá que se preocupar com suas rotas
|
2329
2329
|
e filtros.
|
2330
2330
|
|
@@ -2369,7 +2369,7 @@ end
|
|
2369
2369
|
|
2370
2370
|
### Gerando URLs
|
2371
2371
|
|
2372
|
-
Para gerar URLs você deve usar o
|
2372
|
+
Para gerar URLs você deve usar o método auxiliar `url` no Haml:
|
2373
2373
|
|
2374
2374
|
```ruby
|
2375
2375
|
%a{:href => url('/foo')} foo
|
@@ -2382,7 +2382,7 @@ Esse método é também apelidado para `to` (veja
|
|
2382
2382
|
|
2383
2383
|
### Redirecionamento do Browser
|
2384
2384
|
|
2385
|
-
Você pode lançar um redirecionamento no browser com o
|
2385
|
+
Você pode lançar um redirecionamento no browser com o método auxiliar
|
2386
2386
|
`redirect`:
|
2387
2387
|
|
2388
2388
|
```ruby
|
@@ -2391,7 +2391,7 @@ get '/foo' do
|
|
2391
2391
|
end
|
2392
2392
|
```
|
2393
2393
|
|
2394
|
-
Quaisquer
|
2394
|
+
Quaisquer parâmetros adicionais são interpretados como argumentos passados ao
|
2395
2395
|
`halt`:
|
2396
2396
|
|
2397
2397
|
```ruby
|
@@ -2532,7 +2532,7 @@ etag '', :new_resource => true, :kind => :weak
|
|
2532
2532
|
### Enviando Arquivos
|
2533
2533
|
|
2534
2534
|
Para retornar os conteúdos de um arquivo como as resposta, você pode usar o
|
2535
|
-
|
2535
|
+
método auxiliar `send_file`:
|
2536
2536
|
|
2537
2537
|
```ruby
|
2538
2538
|
get '/' do
|
@@ -2575,14 +2575,14 @@ As opções são:
|
|
2575
2575
|
Código de status a ser enviado. Útil quando está se enviando um arquivo
|
2576
2576
|
estático como uma página de erro. Se suportado pelo handler do Rack,
|
2577
2577
|
outros meios além de transmissão do processo do Ruby serão usados.
|
2578
|
-
So você usar esse
|
2578
|
+
So você usar esse método auxiliar, o Sinatra irá automaticamente lidar
|
2579
2579
|
com requisições de alcance.
|
2580
2580
|
</dd>
|
2581
2581
|
</dl>
|
2582
2582
|
|
2583
2583
|
### Acessando o Objeto da Requisção
|
2584
2584
|
|
2585
|
-
O objeto vindo da requisição pode ser acessado do nível de
|
2585
|
+
O objeto vindo da requisição pode ser acessado do nível de requisição (filtros,
|
2586
2586
|
rotas, manipuladores de erro) através do método `request`:
|
2587
2587
|
|
2588
2588
|
```ruby
|
@@ -2604,7 +2604,7 @@ get '/foo' do
|
|
2604
2604
|
request.host # "exemplo.com"
|
2605
2605
|
request.get? # true (metodo similar para outros tipos de requisição)
|
2606
2606
|
request.form_data? # false
|
2607
|
-
request["algum_ param"] # valor do
|
2607
|
+
request["algum_ param"] # valor do parâmetro 'algum_param'. [] é um atalho para o hash de parâmetros
|
2608
2608
|
request.referrer # a referência do cliente ou '/'
|
2609
2609
|
request.user_agent # agente de usuário (usado por :agent condition)
|
2610
2610
|
request.cookies # hash dos cookies do browser
|
@@ -2627,7 +2627,7 @@ get "/" do
|
|
2627
2627
|
"todas requisições acabam aqui"
|
2628
2628
|
end
|
2629
2629
|
```
|
2630
|
-
`request.body` é uma ES ou um
|
2630
|
+
`request.body` é uma ES ou um objeto StringIO:
|
2631
2631
|
|
2632
2632
|
```ruby
|
2633
2633
|
post "/api" do
|
@@ -2851,7 +2851,7 @@ set :protection, :session => true
|
|
2851
2851
|
<dt>add_charset</dt>
|
2852
2852
|
<dd>
|
2853
2853
|
Para tipos Mime o método auxiliar <tt>content_type</tt> irá
|
2854
|
-
automaticamente adicionar a
|
2854
|
+
automaticamente adicionar a informação de codificação. Você deve adicionar
|
2855
2855
|
isto no lugar de sobrescrever essa opção:
|
2856
2856
|
<tt>settings.add_charset << "application/foobar"</tt>
|
2857
2857
|
</dd>
|
@@ -2980,7 +2980,7 @@ set :protection, :session => true
|
|
2980
2980
|
<tt>server_settings</tt>, tais como <tt>SSLEnable</tt> ou
|
2981
2981
|
<tt>SSLVerifyClient</tt>. Entretanto, servidores web como Puma e Thin não
|
2982
2982
|
suportam isso, então você pode definir <tt>server_settings</tt> como um
|
2983
|
-
|
2983
|
+
método quando chamar <tt>configure</tt>.
|
2984
2984
|
</dd>
|
2985
2985
|
|
2986
2986
|
<dt>sessions</dt>
|
@@ -3065,7 +3065,7 @@ podem ser definidos através da variável de ambiente `APP_ENV`. O valor padrão
|
|
3065
3065
|
`"development"`. No ambiente `"development"` todos os templates são
|
3066
3066
|
recarregados entre as requisições e manipuladores especiais como `not_found` e
|
3067
3067
|
`error` exibem relatórios de erros no seu navegador. Nos ambientes de
|
3068
|
-
`"production"` e `"test"`, os templates são
|
3068
|
+
`"production"` e `"test"`, os templates são guardados em cache por padrão.
|
3069
3069
|
|
3070
3070
|
Para rodar diferentes ambientes, defina a variável de ambiente `APP_ENV`:
|
3071
3071
|
|
@@ -3205,12 +3205,12 @@ use Rack::Auth::Basic do |usuario, senha|
|
|
3205
3205
|
end
|
3206
3206
|
```
|
3207
3207
|
|
3208
|
-
O Rack é
|
3208
|
+
O Rack é distribuído com uma variedade de middleware padrões para logs,
|
3209
3209
|
debugs, rotas de URL, autenticação, e manipuladores de sessão. Sinatra
|
3210
3210
|
utilizada muitos desses componentes automaticamente baseando sobre
|
3211
3211
|
configuração, então, tipicamente você não tem `use` explicitamente.
|
3212
3212
|
|
3213
|
-
Você pode achar
|
3213
|
+
Você pode achar middlewares utéis em
|
3214
3214
|
[rack](https://github.com/rack/rack/tree/master/lib/rack),
|
3215
3215
|
[rack-contrib](https://github.com/rack/rack-contrib#readme),
|
3216
3216
|
ou em [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware).
|
@@ -3238,7 +3238,7 @@ class MinhaAplicacaoTeste < Minitest::Test
|
|
3238
3238
|
assert_equal 'Ola Mundo!', last_response.body
|
3239
3239
|
end
|
3240
3240
|
|
3241
|
-
def
|
3241
|
+
def teste_com_parâmetros
|
3242
3242
|
get '/atender', :name => 'Frank'
|
3243
3243
|
assert_equal 'Olá Frank!', last_response.bodymeet
|
3244
3244
|
end
|
@@ -3256,7 +3256,7 @@ NOTA: Se você está usando o Sinatra no estilo modular, substitua
|
|
3256
3256
|
## Sinatra::Base - Middleware, Bibliotecas e aplicativos modulares
|
3257
3257
|
|
3258
3258
|
Definir sua aplicação em um nível superior de trabalho funciona bem para
|
3259
|
-
micro aplicativos, mas tem consideráveis
|
3259
|
+
micro aplicativos, mas tem consideráveis inconvenientes na construção de
|
3260
3260
|
componentes reutilizáveis como um middleware Rack, metal Rails,
|
3261
3261
|
bibliotecas simples como um componente de servidor, ou mesmo extensões
|
3262
3262
|
Sinatra. A DSL de nível superior polui o espaço do objeto e assume um
|
@@ -3293,7 +3293,7 @@ numa subclasse de `Sinatra::Base`.
|
|
3293
3293
|
padrão, incluindo o servidor embutido. Veja [Opções e
|
3294
3294
|
Configurações](http://www.sinatrarb.com/configuration.html) para
|
3295
3295
|
detalhes de opções disponíveis e seus comportamentos. Se você quer
|
3296
|
-
comportamento mais
|
3296
|
+
comportamento mais similar à quando você definiu sua aplicação em nível mais
|
3297
3297
|
alto (também conhecido como estilo Clássico), você pode usar subclasses de
|
3298
3298
|
`Sinatra::Application`:
|
3299
3299
|
|
@@ -3567,7 +3567,7 @@ Você pode atingir o escopo do objeto (a classe) de duas maneiras:
|
|
3567
3567
|
|
3568
3568
|
### Escopo de Instância/Requisição
|
3569
3569
|
|
3570
|
-
Para toda
|
3570
|
+
Para toda requisição que chega, uma nova instância da classe da sua aplicação é
|
3571
3571
|
criada e todos blocos de manipulação rodam nesse escopo. Dentro desse escopo
|
3572
3572
|
você pode acessar os objetos `request` e `session` ou chamar métodos de
|
3573
3573
|
renderização como `erb` ou `haml`. Você pode acessar o escopo da aplicação de
|
@@ -3599,8 +3599,8 @@ Você tem a ligação ao escopo da requisição dentro dos:
|
|
3599
3599
|
|
3600
3600
|
### Escopo de Delegação
|
3601
3601
|
|
3602
|
-
O escopo de delegação apenas encaminha métodos ao escopo da classe.
|
3603
|
-
ele não se comporta exatamente como o escopo da
|
3602
|
+
O escopo de delegação apenas encaminha métodos ao escopo da classe. Entretanto,
|
3603
|
+
ele não se comporta exatamente como o escopo da classe já que você não tem a
|
3604
3604
|
ligação da classe. Apenas métodos marcados explicitamente para delegação
|
3605
3605
|
estarão disponíveis e você não compartilha variáveis/estado com o escopo da
|
3606
3606
|
classe (leia: você tem um `self` diferente). Você pode explicitamente adicionar
|
@@ -3636,11 +3636,11 @@ As opções são:
|
|
3636
3636
|
|
3637
3637
|
_Parafraseando [esta resposta no StackOverflow](resposta-so) por Konstantin_
|
3638
3638
|
|
3639
|
-
Sinatra não impõe nenhum modelo de
|
3639
|
+
Sinatra não impõe nenhum modelo de concorrência, mas deixa isso como
|
3640
3640
|
responsabilidade do Rack (servidor) subjacente como o Thin, Puma ou WEBrick.
|
3641
3641
|
Sinatra por si só é thread-safe, então não há nenhum problema se um Rack
|
3642
3642
|
handler usar um modelo de thread de concorrência. Isso significaria que ao
|
3643
|
-
iniciar o servidor, você teria que
|
3643
|
+
iniciar o servidor, você teria que especificar o método de invocação correto
|
3644
3644
|
para o Rack handler específico. Os seguintes exemplos é uma demonstração de
|
3645
3645
|
como iniciar um servidor Thin multi-thread:
|
3646
3646
|
|
@@ -3682,7 +3682,7 @@ As seguintes versões do Ruby são oficialmente suportadas:
|
|
3682
3682
|
|
3683
3683
|
<dt>JRuby</dt>
|
3684
3684
|
<dd>
|
3685
|
-
A
|
3685
|
+
A última versão estável lançada do JRuby é oficialmente suportada. Não é
|
3686
3686
|
recomendado usar extensões em C com o JRuby. É recomendado rodar
|
3687
3687
|
<tt>gem install trinidad</tt>.
|
3688
3688
|
</dd>
|