README.es.md in sinatra-1.4.5 vs README.es.md in sinatra-1.4.6

- old
+ new

@@ -73,38 +73,38 @@ través del hash `params`: ``` ruby get '/hola/:nombre' do # coincide con "GET /hola/foo" y "GET /hola/bar" - # params[:nombre] es 'foo' o 'bar' - "Hola #{params[:nombre]}!" + # params['nombre'] es 'foo' o 'bar' + "Hola #{params['nombre']}!" end ``` También puede acceder a los parámetros nombrados usando parámetros de bloque: ``` ruby get '/hola/:nombre' do |n| # coincide con "GET /hola/foo" y "GET /hola/bar" - # params[:nombre] es 'foo' o 'bar' - # n almacena params[:nombre] + # params['nombre'] es 'foo' o 'bar' + # n almacena params['nombre'] "Hola #{n}!" end ``` Los patrones de ruta también pueden incluir parámetros splat (o wildcard), -accesibles a través del arreglo `params[:splat]`: +accesibles a través del arreglo `params['splat']`: ``` ruby get '/decir/*/al/*' do # coincide con /decir/hola/al/mundo - params[:splat] # => ["hola", "mundo"] + params['splat'] # => ["hola", "mundo"] end get '/descargar/*.*' do # coincide con /descargar/path/al/archivo.xml - params[:splat] # => ["path/al/archivo", "xml"] + params['splat'] # => ["path/al/archivo", "xml"] end ``` O, con parámetros de bloque: @@ -115,12 +115,12 @@ ``` Rutas con Expresiones Regulares: ``` ruby -get %r{/hola/([\w]+)} do - "Hola, #{params[:captures].first}!" +get /\A\/hola\/([\w]+)\z/ do + "Hola, #{params['captures'].first}!" end ``` O con un parámetro de bloque: @@ -148,15 +148,15 @@ Las rutas pueden incluir una variedad de condiciones de selección, como por ejemplo el user agent: ``` ruby get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do - "Estás usando la versión de Songbird #{params[:agent][0]}" + "Estás usando la versión de Songbird #{params['agent'][0]}" end get '/foo' do - # Coincide con browsers que no sean songbird + # Coincide con navegadores que no sean songbird end ``` Otras condiciones disponibles son `host_name` y `provides`: @@ -334,12 +334,12 @@ get '/' do erb :index, :layout => :post end ``` -Renderiza `views/index.erb` embebido en `views/post.erb` (por -defecto, la plantilla `:index` es embebida en `views/layout.erb` siempre y +Renderiza `views/index.erb` incrustado en `views/post.erb` (por +defecto, la plantilla `:index` es incrustada en `views/layout.erb` siempre y cuando este último archivo exista). Cualquier opción que Sinatra no entienda le será pasada al motor de renderizado de la plantilla: @@ -481,11 +481,11 @@ <table> <tr> <td>Dependencias</td> <td> - <a href="http://builder.rubyforge.org/" title="builder">builder</a> + <a href="https://github.com/jimweirich/builder" title="builder">builder</a> </td> </tr> <tr> <td>Extensiones de Archivo</td> <td><tt>.builder</tt></td> @@ -494,11 +494,11 @@ <td>Ejemplo</td> <td><tt>builder { |xml| xml.em "hola" }</tt></td> </tr> </table> -Además, acepta un bloque con la definición de la plantilla (ver el ejemplo). +Además, acepta un bloque con la definición de la plantilla (ver ejemplo). ### Plantillas Nokogiri <table> <tr> @@ -513,11 +513,11 @@ <td>Ejemplo</td> <td><tt>nokogiri { |xml| xml.em "hola" }</tt></td> </tr> </table> -Además, acepta un bloque con la definición de la plantilla (ver el ejemplo). +Además, acepta un bloque con la definición de la plantilla (ver ejemplo). ### Plantillas Sass <table> <tr> @@ -595,12 +595,12 @@ <td>Dependencias</td> <td> <a href="https://github.com/rtomayko/rdiscount" title="RDiscount">RDiscount</a>, <a href="https://github.com/vmg/redcarpet" title="RedCarpet">RedCarpet</a>, <a href="http://deveiate.org/projects/BlueCloth" title="BlueCloth">BlueCloth</a>, - <a href="http://kramdown.rubyforge.org/" title="kramdown">kramdown</a> o - <a href="http://maruku.rubyforge.org/" title="maruku">maruku</a> + <a href="http://kramdown.gettalong.org/" title="kramdown">kramdown</a> o + <a href="https://github.com/bhollis/maruku" title="maruku">maruku</a> </td> </tr> <tr> <td>Extensiones de Archivo</td> <td><tt>.markdown</tt>, <tt>.mkd</tt> y <tt>.md</tt></td> @@ -669,11 +669,11 @@ ### Plantillas RDoc <table> <tr> <td>Dependencias</td> - <td><a href="http://rdoc.rubyforge.org/" title="RDoc">RDoc</a></td> + <td><a href="http://rdoc.sourceforge.net/" title="RDoc">RDoc</a></td> </tr> <tr> <td>Extensiones de Archivo</td> <td><tt>.rdoc</tt></td> </tr> @@ -705,11 +705,11 @@ ### Plantillas Radius <table> <tr> <td>Dependencias</td> - <td><a href="http://radius.rubyforge.org/" title="Radius">Radius</a></td> + <td><a href="https://github.com/jlong/radius" title="Radius">Radius</a></td> </tr> <tr> <td>Extensiones de Archivo</td> <td><tt>.radius</tt></td> </tr> @@ -717,11 +717,11 @@ <td>Ejemplo</td> <td><tt>radius :index, :locals => { :clave => 'valor' }</tt></td> </tr> </table> -Desde que no se puede utilisar métodos de Ruby (excepto por `yield`) de una +Desde que no se puede utilizar métodos de Ruby (excepto por `yield`) de una plantilla Radius, casi siempre se necesita pasar locales. ### Plantillas Markaby <table> @@ -737,11 +737,11 @@ <td>Ejemplo</td> <td><tt>markaby { h1 "Bienvenido!" }</tt></td> </tr> </table> -Además, acepta un bloque con la definición de la plantilla (ver el ejemplo). +Además, acepta un bloque con la definición de la plantilla (ver ejemplo). ### Plantillas RABL <table> <tr> @@ -806,11 +806,11 @@ %h1 Hola Desde Haml! %p= creole(:saludos) ``` Como no podés utilizar Ruby desde Creole, no podés usar layouts escritos en -Creloe. De todos modos, es posible usar un motor de renderizado para el layout +Creole. De todos modos, es posible usar un motor de renderizado para el layout distinto al de la plantilla pasando la opción `:layout_engine`. ### Plantillas CoffeeScript <table> @@ -881,11 +881,11 @@ </tt> </td> </tr> </table> -El contenido de La plantilla se evalúa como código Ruby, y la variable `json` es convertida a JSON mediante `#to_json`. +El contenido de la plantilla se evalúa como código Ruby, y la variable `json` es convertida a JSON mediante `#to_json`. ``` ruby json = { :foo => 'bar' } json[:baz] = key ``` @@ -932,20 +932,20 @@ ruta. Las variables de instancia asignadas en los manejadores de ruta son accesibles directamente por las plantillas: ``` ruby get '/:id' do - @foo = Foo.find(params[:id]) + @foo = Foo.find(params['id']) haml '%h1= @foo.nombre' end ``` O es posible especificar un Hash de variables locales explícitamente: ``` ruby get '/:id' do - foo = Foo.find(params[:id]) + foo = Foo.find(params['id']) haml '%h1= bar.nombre', :locals => { :bar => foo } end ``` Esto es usado típicamente cuando se renderizan plantillas como parciales desde @@ -972,11 +972,11 @@ @@ index %div.titulo Hola mundo!!!!! ``` NOTA: únicamente las plantillas inline definidas en el archivo fuente que -requiere sinatra son cargadas automáticamente. Llamá `enable +requiere Sinatra son cargadas automáticamente. Llamá `enable :inline_templates` explícitamente si tenés plantillas inline en otros archivos fuente. ### Plantillas Nombradas @@ -1050,11 +1050,11 @@ request.path_info = '/foo/bar/baz' end get '/foo/*' do @nota #=> 'Hey!' - params[:splat] #=> 'bar/baz' + params['splat'] #=> 'bar/baz' end ``` Los filtros `after` son evaluados después de cada petición dentro del mismo contexto y también pueden modificar la petición y la respuesta. Las variables @@ -1108,11 +1108,11 @@ "#{nombre}bar" end end get '/:nombre' do - bar(params[:nombre]) + bar(params['nombre']) end ``` Por cuestiones organizativas, puede resultar conveniente organizar los métodos ayudantes en distintos módulos: @@ -1143,11 +1143,11 @@ get '/' do "valor = " << session[:valor].inspect end get '/:valor' do - session[:valor] = params[:valor] + session[:valor] = params['valor'] end ``` Tené en cuenta que `enable :sessions` guarda todos los datos en una cookie, lo cual no es siempre deseable (guardar muchos datos va a incrementar @@ -1161,11 +1161,11 @@ get '/' do "valor = " << session[:valor].inspect end get '/:valor' do - session[:valor] = params[:valor] + session[:valor] = params['valor'] end ``` Para incrementar la seguridad, los datos de la sesión almacenados en la cookie son firmados con un secreto de sesión. Este secreto, es @@ -1228,11 +1228,11 @@ Una ruta puede pasarle el procesamiento a la siguiente ruta que coincida con la petición usando `pass`: ``` ruby get '/adivina/:quien' do - pass unless params[:quien] == 'Franco' + pass unless params['quien'] == 'Franco' 'Adivinaste!' end get '/adivina/*' do 'Erraste!' @@ -1261,11 +1261,11 @@ Notá que en el ejemplo anterior, es conveniente mover `"bar"` a un helper, y llamarlo desde `/foo` y `/bar`. Así, vas a simplificar las pruebas y a mejorar el rendimiento. Si querés que la petición se envíe a la misma instancia de la aplicación en -lugar de a otra, usá `call!` en lugar de `call`. +lugar de otra, usá `call!` en lugar de `call`. En la especificación de Rack podés encontrar más información sobre `call`. ### Asignando el Código de Estado, los Encabezados y el Cuerpo de una Respuesta @@ -1307,11 +1307,11 @@ ### Streaming De Respuestas A veces vas a querer empezar a enviar la respuesta a pesar de que todavía no terminaste de generar su cuerpo. También es posible que, en algunos casos, quieras seguir enviando información hasta que el cliente cierre la conexión. -Cuando esto ocurra, el `stream` helper te va a ser de gran ayuda: +Cuando esto ocurra, el helper `stream` te va a ser de gran ayuda: ``` ruby get '/' do stream do |out| out << "Esto va a ser legen -\n" @@ -1329,11 +1329,11 @@ puede ser usado para incrementar el throughput si solo una parte del contenido depende de un recurso lento. Hay que tener en cuenta que el comportamiento del streaming, especialmente el número de peticiones concurrentes, depende del servidor web utilizado para -servir la aplicación. Puede que algunos servidores, como es el caso de +alojar la aplicación. Puede que algunos servidores, como es el caso de WEBRick, no soporten streaming directamente, así el cuerpo de la respuesta será enviado completamente de una vez cuando el bloque pasado a `stream` finalice su ejecución. Si estás usando Shotgun, el streaming no va a funcionar. Cuando se pasa `keep_open` como parámetro, no se va a enviar el mensaje @@ -1351,11 +1351,11 @@ stream(:keep_open) { |salida| conexiones << salida } end post '/' do # escribimos a todos los streams abiertos - conexiones.each { |salida| salida << params[:mensaje] << "\n" } + conexiones.each { |salida| salida << params['mensaje'] << "\n" } "mensaje enviado" end ``` ### Log (Registro) @@ -1510,17 +1510,17 @@ expires 500, :public, :must_revalidate end ``` Para usar cachés adecuadamente, deberías considerar usar `etag` o -`last_modified`. Es recomendable que llames a estos helpers *antes* de hacer +`last_modified`. Es recomendable que llames a estos asistentes *antes* de hacer cualquier trabajo pesado, ya que van a enviar la respuesta inmediatamente si el cliente ya tiene la versión actual en su caché: ``` ruby get '/articulo/:id' do - @articulo = Articulo.find params[:id] + @articulo = Articulo.find params['id'] last_modified @articulo.updated_at etag @articulo.sha1 erb :articulo end ``` @@ -1555,12 +1555,12 @@ para más detalles). De acuerdo con la RFC 2616 tu aplicación debería comportarse diferente si a las cabeceras If-Match o If-None-Match se le asigna el valor `*` cuando el recurso solicitado ya existe. Sinatra asume para peticiones seguras (como get) -e idempotentes (como put) que el recurso existe, mientras que para el resto -(como post) asume que no. Podes cambiar este comportamiento con la opción +y potentes (como put) que el recurso existe, mientras que para el resto +(como post) asume que no. Podés cambiar este comportamiento con la opción `:new_resource`: ``` ruby get '/crear' do etag '', :new_resource => true @@ -1614,11 +1614,11 @@ [status] código de estado devuelto. Resulta útil al enviar un archivo estático como una página de error. Si el Rack handler lo soporta, se intentará no transmitir directamente desde el -proceso de Ruby. Si usás este método, Sinatra se va a encargar automáticamente +proceso de Ruby. Si usás este método, Sinatra se va a encargar automáticamente de las peticiones de rango. ### Accediendo al objeto de la petición El objeto de la petición entrante puede ser accedido desde el nivel de la @@ -1645,11 +1645,11 @@ request.get? # true (hay métodos análogos para los otros verbos) request.form_data? # false request["UNA_CABECERA"] # valor de la cabecera UNA_CABECERA request.referrer # la referencia del cliente o '/' request.user_agent # user agent (usado por la condición :agent) - request.cookies # hash de las cookies del browser + request.cookies # hash de las cookies del navegador request.xhr? # es una petición ajax? request.url # "http://ejemplo.com/ejemplo/foo" request.path # "/ejemplo/foo" request.ip # dirección IP del cliente request.secure? # false (sería true sobre ssl) @@ -1679,11 +1679,11 @@ end ``` ### Archivos Adjuntos -Podés usar el método helper `attachment` para indicarle al navegador que +Podés usar el helper `attachment` para indicarle al navegador que almacene la respuesta en el disco en lugar de mostrarla en pantalla: ``` ruby get '/' do attachment @@ -1781,11 +1781,11 @@ Notá que `find_template` no verifica si un archivo existe realmente, sino que llama al bloque que recibe para cada path posible. Esto no representa un problema de rendimiento debido a que `render` va a usar `break` ni bien encuentre un archivo que exista. Además, las ubicaciones de las plantillas (y su contenido) se cachean cuando no estás en el modo de desarrollo. Es bueno -tener en cuenta lo anteiror si escribís un método medio loco. +tener en cuenta lo anterior si escribís un método extraño. ## Configuración Ejecutar una vez, en el inicio, en cualquier entorno: @@ -1842,11 +1842,11 @@ ### Configurando la Protección de Ataques Sinatra usa [Rack::Protection](https://github.com/rkh/rack-protection#readme) para defender a tu aplicación de los ataques más comunes. Si por algún motivo, querés desactivar esta funcionalidad, podés hacerlo como se indica a -continuación (tené en cuenta que tu aplicación va a quedar expuesta a un +continuación (ten en cuenta que tu aplicación va a quedar expuesta a un montón de vulnerabilidades bien conocidas): ``` ruby disable :protection ``` @@ -1879,18 +1879,18 @@ menos que le pasés <tt>false</tt> como segundo parámetro. Deshabilitada por defecto. </dd> - <dt>add_charsets</dt> + <dt>add_charset</dt> <dd> Tipos mime a los que el helper <tt>content_type</tt> les añade automáticamente el charset. En general, no deberías asignar directamente esta opción, sino añadirle los charsets que quieras: - <tt>settings.add_charsets &lt;&lt; "application/foobar"</tt> + <tt>settings.add_charset &lt;&lt; "application/foobar"</tt> </dd> <dt>app_file</dt> <dd> Path del archivo principal de la aplicación, se utiliza @@ -1972,11 +1972,11 @@ continuación. </dd> <dt>public_folder</dt> <dd> - Path del directorio desde donde se sirven los archivos + Lugar del directorio desde donde se sirven los archivos públicos. Solo se utiliza cuando se sirven archivos estáticos (ver la opción <tt>static</tt>). Si no está presente, se infiere del valor de la opción <tt>app_file</tt>. </dd> @@ -1988,11 +1988,11 @@ Se encuentra activado en el entorno de desarrollo. </dd> <dt>root</dt> <dd> - Path del directorio raíz del proyecto. Si no está + Lugar del directorio raíz del proyecto. Si no está presente, se infiere del valor de la opción <tt>app_file</tt>. </dd> <dt>raise_errors</dt> @@ -2010,11 +2010,11 @@ usando rackup o algún otro medio. </dd> <dt>running</dt> <dd> - Indica si el servidor integrado está ejecutandose, ¡no + Indica si el servidor integrado está ejecutándose, ¡no cambiés esta configuración!. </dd> <dt>server</dt> <dd> @@ -2051,11 +2051,11 @@ </dd> <dt>static_cache_control</dt> <dd> Cuando Sinatra está sirviendo archivos estáticos, y - está opción está habilitada, les va a agregar encabezados + esta opción está habilitada, les va a agregar encabezados <tt>Cache-Control</tt> a las respuestas. Para esto utiliza el helper <tt>cache_control</tt>. Se encuentra deshabilitada por defecto. Notar que es necesario utilizar un array cuando se asignan múltiples valores: <tt>set :static_cache_control, [:public, :max_age => 300]</tt>. @@ -2113,11 +2113,11 @@ desde un bloque de ruta o un filtro. El objeto de la excepción se puede obtener de la variable Rack `sinatra.error`: ``` ruby error do - 'Disculpá, ocurrió un error horrible - ' + env['sinatra.error'].name + 'Disculpá, ocurrió un error horrible - ' + env['sinatra.error'].message end ``` Errores personalizados: @@ -2162,11 +2162,11 @@ Sinatra instala manejadores `not_found` y `error` especiales cuando se ejecuta dentro del entorno de desarrollo "development". ## Rack Middleware -Sinatra corre sobre Rack[http://rack.rubyforge.org/], una interfaz minimalista +Sinatra corre sobre [Rack](http://rack.github.io/), una interfaz minimalista que es un estándar para frameworks webs escritos en Ruby. Una de las características más interesantes de Rack para los desarrolladores de aplicaciones es el soporte de "middleware" -- componentes que se ubican entre el servidor y tu aplicación, supervisando y/o manipulando la petición/respuesta HTTP para proporcionar varios tipos de funcionalidades comunes. @@ -2185,24 +2185,24 @@ 'Hola Mundo' end ``` La semántica de `use` es idéntica a la definida para el DSL -Rack::Builder[http://rack.rubyforge.org/doc/classes/Rack/Builder.html] (más +Rack::Builder[http://rubydoc.info/github/rack/rack/master/Rack/Builder] (más frecuentemente usado en archivos rackup). Por ejemplo, el método `use` acepta argumentos múltiples/variables así como bloques: ``` ruby use Rack::Auth::Basic do |nombre_de_usuario, password| nombre_de_usuario == 'admin' && password == 'secreto' end ``` Rack es distribuido con una variedad de middleware estándar para logging, -debugging, enrutamiento URL, autenticación, y manejo de sesiones. Sinatra +debugging, enrutamiento URL, autenticación y manejo de sesiones. Sinatra usa muchos de estos componentes automáticamente de acuerdo a su configuración -para que típicamente no tengas que usarlas (con `use`) explícitamente. +para que usualmente no tengas que usarlas (con `use`) explícitamente. Podés encontrar middleware útil en [rack](https://github.com/rack/rack/tree/master/lib/rack), [rack-contrib](https://github.com/rack/rack-contrib#readme), o en la [Rack wiki](https://github.com/rack/rack/wiki/List-of-Middleware). @@ -2213,14 +2213,14 @@ cualquier framework o librería de pruebas basada en Rack. Se recomienda usar [Rack::Test](http://rdoc.info/github/brynary/rack-test/master/frames): ``` ruby require 'mi_app_sinatra' -require 'test/unit' +require 'minitest/autorun' require 'rack/test' -class MiAppTest < Test::Unit::TestCase +class MiAppTest < Minitest::Test include Rack::Test::Methods def app Sinatra::Application end @@ -2242,14 +2242,14 @@ end ``` ## Sinatra::Base - Middleware, Librerías, y Aplicaciones Modulares -Definir tu aplicación en el top-level funciona bien para micro-aplicaciones +Definir tu aplicación en el nivel superior funciona bien para micro-aplicaciones pero trae inconvenientes considerables a la hora de construir componentes reutilizables como Rack middleware, Rails metal, librerías simples con un -componente de servidor, o incluso extensiones de Sinatra. El DSL de top-level +componente de servidor o incluso extensiones de Sinatra. El DSL de alto nivel asume una configuración apropiada para micro-aplicaciones (por ejemplo, un único archivo de aplicación, los directorios `./public` y `./views`, logging, página con detalles de excepción, etc.). Ahí es donde `Sinatra::Base` entra en el juego: @@ -2285,17 +2285,17 @@ ### Estilo Modular vs. Clásico Contrariamente a la creencia popular, no hay nada de malo con el estilo clásico. Si se ajusta a tu aplicación, no es necesario que la cambies a una modular. -Las desventaja de usar el estilo clásico en lugar del modular consiste en que +La desventaja de usar el estilo clásico en lugar del modular consiste en que solamente podés tener una aplicación Sinatra por proceso Ruby. Si tenés -planificado usar más, cambiá al estilo modular. Al mismo tiempo, tené en +planificado usar más, cambiá al estilo modular. Al mismo tiempo, ten en cuenta que no hay ninguna razón por la cuál no puedas mezclar los estilos clásico y modular. -A continuación se detallan las diferencias (sutiles) entre las configuraciones +A continuación se detallan las diferencias (sútiles) entre las configuraciones de ambos estilos: <table> <tr> <td>Configuración</td> @@ -2395,15 +2395,15 @@ ``` ruby require './app' run Sinatra::Application ``` -### ¿Cuándo Usar config.ru? +### ¿Cuándo usar config.ru? Indicadores de que probablemente querés usar `config.ru`: -* Querés realizar el deploy con un hanlder Rack distinto (Passenger, Unicorn, +* Querés realizar el deploy con un handler Rack distinto (Passenger, Unicorn, Heroku, ...). * Querés usar más de una subclase de `Sinatra::Base`. * Querés usar Sinatra únicamente para middleware, pero no como un endpoint. <b>No hay necesidad de utilizar un archivo `config.ru` exclusivamente @@ -2424,12 +2424,12 @@ enable :sessions get('/login') { haml :login } post('/login') do - if params[:nombre] == 'admin' && params[:password] == 'admin' - session['nombre_de_usuario'] = params[:nombre] + if params['nombre'] == 'admin' && params['password'] == 'admin' + session['nombre_de_usuario'] = params['nombre'] else redirect '/login' end end end @@ -2550,12 +2550,12 @@ # Ey, estoy en el ámbito de la aplicación! get '/definir_ruta/:nombre' do # Ámbito de petición para '/definir_ruta/:nombre' @valor = 42 - settings.get("/#{params[:nombre]}") do - # Ámbito de petición para "/#{params[:nombre]}" + settings.get("/#{params['nombre']}") do + # Ámbito de petición para "/#{params['nombre']}" @valor # => nil (no es la misma petición) end "Ruta definida!" end @@ -2618,25 +2618,25 @@ dejará de dar soporte a 1.8.7 hasta Sinatra 2.0 y Ruby 2.0, aunque si se libera la versión 1.8.8 de Ruby las cosas podrían llegar a cambiar. Sin embargo, que eso ocurra es muy poco probable, e incluso el caso de que lo haga, puede que se siga dando soporte a 1.8.7. <b>Hemos dejado de soportar Ruby 1.8.6.</b> Si querés ejecutar Sinatra sobre 1.8.6, podés utilizar la - versión 1.2, pero tené en cuenta que una vez que Sinatra 1.4.0 sea liberado, + versión 1.2, pero ten en cuenta que una vez que Sinatra 1.4.0 sea liberado, ya no se corregirán errores por más que se reciban reportes de los mismos. </dd> <dt>Ruby 1.9.2</dt> <dd> 1.9.2 es soportado y recomendado. No uses 1.9.2p0, porque se producen fallos de segmentación cuando se ejecuta Sinatra. El soporte se mantendrá al menos hasta que se libere la versión 1.9.4/2.0 de Ruby. El soporte para la última - versión de la serie 1.9 se mantendrá mientras lo haga el core team de Ruby. + versión de la serie 1.9 se mantendrá mientras lo haga el equipo principal de Ruby. </dd> <dt>Ruby 1.9.3</dt> <dd> - 1.9.3 es soportado y recomendado. Tené en cuenta que el cambio a 1.9.3 desde + 1.9.3 es soportado y recomendado. Ten en cuenta que el cambio a 1.9.3 desde una versión anterior va a invalidar todas las sesiones. </dd> <dt>Rubinius</dt> <dd> @@ -2649,11 +2649,11 @@ <dd> JRuby es soportado oficialmente (JRuby >= 1.6.7). No se conocen problemas con librerías de plantillas de terceras partes. Sin embargo, si elegís usar JRuby, deberías examinar sus Rack handlers porque el servidor web Thin no es soportado completamente. El soporte de JRuby para extensiones C se encuentra - en una etapa experimental, sin embargo, de momento solamente RDiscount, + en una etapa experimental, sin embargo, de momento, solamente RDiscount, Redcarpet, RedCloth y Yajl, así como Thin y Mongrel se ven afectadas. </dd> </dl> Siempre le prestamos atención a las nuevas versiones de Ruby. @@ -2664,11 +2664,11 @@ * Versiones anteriores de JRuby y Rubinius * Ruby Enterprise Edition * MacRuby, Maglev e IronRuby * Ruby 1.9.0 y 1.9.1 (pero no te recomendamos que los uses) -No estar soportada oficialmente, significa que si las cosas solamente se rompen +No ser soportada oficialmente, significa que si las cosas se rompen ahí y no en una plataforma soportada, asumimos que no es nuestro problema sino el suyo. Nuestro servidor CI también se ejecuta sobre ruby-head (que será la próxima versión 2.1.0) y la rama 1.9.4. Como están en movimiento constante, no podemos @@ -2697,11 +2697,11 @@ ### Con Bundler Esta es la manera recomendada para ejecutar tu aplicación sobre la última versión de Sinatra usando [Bundler](http://gembundler.com/). -Primero, instalá bundler si no lo hiciste todavía: +Primero, instalá Bundler si no lo hiciste todavía: ``` shell gem install bundler ``` @@ -2774,10 +2774,10 @@ error?. ¿Necesitás ayuda?. ¿Tenés un parche?. * [Seguimiento de problemas](http://github.com/sinatra/sinatra/issues) * [Twitter](http://twitter.com/sinatra) * [Lista de Correo](http://groups.google.com/group/sinatrarb/topics) * [IRC: #sinatra](irc://chat.freenode.net/#sinatra) en http://freenode.net -* [Sinatra Book](http://sinatra-book.gittr.com) Tutorial (en inglés). +* [Sinatra Book](https://github.com/sinatra/sinatra-book/) Tutorial (en inglés). * [Sinatra Recipes](http://recipes.sinatrarb.com/) Recetas contribuidas por la comunidad (en inglés). * Documentación de la API para la [última versión liberada](http://rubydoc.info/gems/sinatra) o para la [rama de desarrollo actual](http://rubydoc.info/github/sinatra/sinatra)