sinatra 2.1.0 → 2.2.2
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/CHANGELOG.md +73 -0
- data/Gemfile +3 -3
- 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 +41 -39
- data/lib/sinatra/indifferent_hash.rb +14 -0
- data/lib/sinatra/version.rb +1 -1
- data/sinatra.gemspec +3 -9
- metadata +10 -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>
|